(Video) use flags for FBO passes, GL2 renderchain, etc

This commit is contained in:
LibretroAdmin 2022-10-26 21:21:21 +02:00
parent fc78f96a3a
commit d0b3c1742d
21 changed files with 223 additions and 146 deletions

View File

@ -775,7 +775,7 @@ static void d3d9_init_singlepass(d3d9_video_t *d3d)
pass = (struct video_shader_pass*) pass = (struct video_shader_pass*)
&d3d->shader.pass[0]; &d3d->shader.pass[0];
pass->fbo.valid = true; pass->fbo.flags |= FBO_SCALE_FLAG_VALID;
pass->fbo.scale_y = 1.0; pass->fbo.scale_y = 1.0;
pass->fbo.type_y = RARCH_SCALE_VIEWPORT; pass->fbo.type_y = RARCH_SCALE_VIEWPORT;
pass->fbo.scale_x = pass->fbo.scale_y; pass->fbo.scale_x = pass->fbo.scale_y;
@ -801,7 +801,7 @@ static bool d3d9_init_multipass(d3d9_video_t *d3d, const char *shader_path)
for (i = 0; i < d3d->shader.passes; i++) for (i = 0; i < d3d->shader.passes; i++)
{ {
if (d3d->shader.pass[i].fbo.valid) if (d3d->shader.pass[i].fbo.flags & FBO_SCALE_FLAG_VALID)
continue; continue;
d3d->shader.pass[i].fbo.scale_y = 1.0f; d3d->shader.pass[i].fbo.scale_y = 1.0f;
@ -811,7 +811,7 @@ static bool d3d9_init_multipass(d3d9_video_t *d3d, const char *shader_path)
} }
use_extra_pass = d3d->shader.passes < GFX_MAX_SHADERS && use_extra_pass = d3d->shader.passes < GFX_MAX_SHADERS &&
d3d->shader.pass[d3d->shader.passes - 1].fbo.valid; (d3d->shader.pass[d3d->shader.passes - 1].fbo.flags & FBO_SCALE_FLAG_VALID);
if (use_extra_pass) if (use_extra_pass)
{ {

View File

@ -1025,7 +1025,7 @@ typedef struct MTLALIGN(16)
{ {
struct video_shader_pass *shader_pass = &_shader->pass[i]; struct video_shader_pass *shader_pass = &_shader->pass[i];
if (shader_pass->fbo.valid) if (shader_pass->fbo.flags & FBO_SCALE_FLAG_VALID)
{ {
switch (shader_pass->fbo.type_x) switch (shader_pass->fbo.type_x)
{ {

View File

@ -1163,7 +1163,7 @@ static void d3d10_init_render_targets(d3d10_video_t* d3d10,
{ {
struct video_shader_pass* pass = &d3d10->shader_preset->pass[i]; struct video_shader_pass* pass = &d3d10->shader_preset->pass[i];
if (pass->fbo.valid) if (pass->fbo.flags & FBO_SCALE_FLAG_VALID)
{ {
switch (pass->fbo.type_x) switch (pass->fbo.type_x)

View File

@ -1739,7 +1739,7 @@ static void d3d11_init_render_targets(d3d11_video_t* d3d11, unsigned width, unsi
{ {
struct video_shader_pass* pass = &d3d11->shader_preset->pass[i]; struct video_shader_pass* pass = &d3d11->shader_preset->pass[i];
if (pass->fbo.valid) if (pass->fbo.flags & FBO_SCALE_FLAG_VALID)
{ {
switch (pass->fbo.type_x) switch (pass->fbo.type_x)

View File

@ -1935,7 +1935,7 @@ static void d3d12_init_render_targets(d3d12_video_t* d3d12, unsigned width, unsi
{ {
struct video_shader_pass* pass = &d3d12->shader_preset->pass[i]; struct video_shader_pass* pass = &d3d12->shader_preset->pass[i];
if (pass->fbo.valid) if (pass->fbo.flags & FBO_SCALE_FLAG_VALID)
{ {
switch (pass->fbo.type_x) switch (pass->fbo.type_x)

View File

@ -1178,11 +1178,11 @@ static bool d3d8_init_internal(d3d8_video_t *d3d,
pass = (struct video_shader_pass*) pass = (struct video_shader_pass*)
&d3d->shader.pass[0]; &d3d->shader.pass[0];
pass->fbo.valid = true;
pass->fbo.scale_y = 1.0; pass->fbo.scale_y = 1.0;
pass->fbo.type_y = RARCH_SCALE_VIEWPORT; pass->fbo.type_y = RARCH_SCALE_VIEWPORT;
pass->fbo.scale_x = pass->fbo.scale_y; pass->fbo.scale_x = pass->fbo.scale_y;
pass->fbo.type_x = pass->fbo.type_y; pass->fbo.type_x = pass->fbo.type_y;
pass->fbo.flags |= FBO_SCALE_FLAG_VALID;
if (!string_is_empty(d3d->shader_path)) if (!string_is_empty(d3d->shader_path))
strlcpy(pass->source.path, d3d->shader_path, strlcpy(pass->source.path, d3d->shader_path,

View File

@ -115,8 +115,8 @@ static INLINE bool d3d9_renderchain_add_pass(d3d9_renderchain_t *chain,
info->tex_h, info->tex_h,
1, 1,
D3DUSAGE_RENDERTARGET, D3DUSAGE_RENDERTARGET,
chain->passes->data[ (chain->passes->data[
chain->passes->count - 1].info.pass->fbo.fp_fbo chain->passes->count - 1].info.pass->fbo.flags & FBO_SCALE_FLAG_FP_FBO)
? D3DFMT_A32B32G32R32F : D3D9_ARGB8888_FORMAT, ? D3DFMT_A32B32G32R32F : D3D9_ARGB8888_FORMAT,
D3DPOOL_DEFAULT, 0, 0, 0, NULL, NULL, false); D3DPOOL_DEFAULT, 0, 0, 0, NULL, NULL, false);
@ -285,8 +285,9 @@ static INLINE bool d3d9_renderchain_set_pass_size(
d3d9_texture_new(dev, d3d9_texture_new(dev,
width, height, 1, width, height, 1,
D3DUSAGE_RENDERTARGET, D3DUSAGE_RENDERTARGET,
pass2->info.pass->fbo.fp_fbo ? (pass2->info.pass->fbo.flags & FBO_SCALE_FLAG_FP_FBO)
D3DFMT_A32B32G32R32F : D3D9_ARGB8888_FORMAT, ? D3DFMT_A32B32G32R32F
: D3D9_ARGB8888_FORMAT,
D3DPOOL_DEFAULT, 0, 0, 0, D3DPOOL_DEFAULT, 0, 0, 0,
NULL, NULL, false); NULL, NULL, false);

View File

@ -159,6 +159,15 @@ typedef struct __GLsync *GLsync;
#endif #endif
#endif #endif
enum gl2_renderchain_flags
{
GL2_CHAIN_FLAG_EGL_IMAGES = (1 << 0),
GL2_CHAIN_FLAG_HAS_FP_FBO = (1 << 1),
GL2_CHAIN_FLAG_HAS_SRGB_FBO_GLES3 = (1 << 2),
GL2_CHAIN_FLAG_HAS_SRGB_FBO = (1 << 3),
GL2_CHAIN_FLAG_HW_RENDER_DEPTH_INIT = (1 << 4)
};
typedef struct gl2_renderchain_data typedef struct gl2_renderchain_data
{ {
int fbo_pass; int fbo_pass;
@ -175,12 +184,7 @@ typedef struct gl2_renderchain_data
unsigned fence_count; unsigned fence_count;
struct gfx_fbo_scale fbo_scale[GFX_MAX_SHADERS]; struct gfx_fbo_scale fbo_scale[GFX_MAX_SHADERS];
uint8_t flags;
bool egl_images;
bool has_fp_fbo;
bool has_srgb_fbo_gles3;
bool has_srgb_fbo;
bool hw_render_depth_init;
} gl2_renderchain_data_t; } gl2_renderchain_data_t;
#if (!defined(HAVE_OPENGLES) || defined(HAVE_OPENGLES3)) #if (!defined(HAVE_OPENGLES) || defined(HAVE_OPENGLES3))
@ -273,7 +277,7 @@ static bool gl2_shader_scale(gl2_t *gl,
if (!scaler || !scaler->scale) if (!scaler || !scaler->scale)
return false; return false;
scaler->scale->valid = false; scaler->scale->flags &= ~FBO_SCALE_FLAG_VALID;
gl->shader->shader_scale(gl->shader_data, gl->shader->shader_scale(gl->shader_data,
scaler->idx, scaler->scale); scaler->idx, scaler->scale);
@ -585,7 +589,7 @@ static void gl2_renderchain_render(
} }
#if defined(GL_FRAMEBUFFER_SRGB) && !defined(HAVE_OPENGLES) #if defined(GL_FRAMEBUFFER_SRGB) && !defined(HAVE_OPENGLES)
if (chain->has_srgb_fbo) if (chain->flags & GL2_CHAIN_FLAG_HAS_SRGB_FBO)
glDisable(GL_FRAMEBUFFER_SRGB); glDisable(GL_FRAMEBUFFER_SRGB);
#endif #endif
@ -694,7 +698,7 @@ static void gl2_renderchain_deinit_hw_render(
if (gl->hw_render_fbo_init) if (gl->hw_render_fbo_init)
gl2_delete_fb(gl->textures, gl->hw_render_fbo); gl2_delete_fb(gl->textures, gl->hw_render_fbo);
if (chain->hw_render_depth_init) if (chain->flags & GL2_CHAIN_FLAG_HW_RENDER_DEPTH_INIT)
gl2_delete_rb(gl->textures, chain->hw_render_depth); gl2_delete_rb(gl->textures, chain->hw_render_depth);
gl->hw_render_fbo_init = false; gl->hw_render_fbo_init = false;
@ -830,16 +834,17 @@ static void gl2_create_fbo_texture(gl2_t *gl,
GL2_BIND_TEXTURE(texture, wrap_enum, mag_filter, min_filter); GL2_BIND_TEXTURE(texture, wrap_enum, mag_filter, min_filter);
fp_fbo = chain->fbo_scale[i].fp_fbo; fp_fbo = chain->fbo_scale[i].flags & FBO_SCALE_FLAG_FP_FBO;
if (fp_fbo) if (fp_fbo)
{ {
if (!chain->has_fp_fbo) if (!(chain->flags & GL2_CHAIN_FLAG_HAS_FP_FBO))
RARCH_ERR("[GL]: Floating-point FBO was requested, but is not supported. Falling back to UNORM. Result may band/clip/etc.!\n"); RARCH_ERR("[GL]: Floating-point FBO was requested, but is not supported. Falling back to UNORM. Result may band/clip/etc.!\n");
} }
#if !defined(HAVE_OPENGLES2) #if !defined(HAVE_OPENGLES2)
if (fp_fbo && chain->has_fp_fbo) if ( fp_fbo
&& (chain->flags & GL2_CHAIN_FLAG_HAS_FP_FBO))
{ {
RARCH_LOG("[GL]: FBO pass #%d is floating-point.\n", i); RARCH_LOG("[GL]: FBO pass #%d is floating-point.\n", i);
gl2_load_texture_image(GL_TEXTURE_2D, 0, GL_RGBA32F, gl2_load_texture_image(GL_TEXTURE_2D, 0, GL_RGBA32F,
@ -850,18 +855,19 @@ static void gl2_create_fbo_texture(gl2_t *gl,
#endif #endif
{ {
#ifndef HAVE_OPENGLES #ifndef HAVE_OPENGLES
bool srgb_fbo = chain->fbo_scale[i].srgb_fbo; bool srgb_fbo = chain->fbo_scale[i].flags & FBO_SCALE_FLAG_SRGB_FBO;
if (!fp_fbo && srgb_fbo) if (!fp_fbo && srgb_fbo)
{ {
if (!chain->has_srgb_fbo) if (!(chain->flags & GL2_CHAIN_FLAG_HAS_SRGB_FBO))
RARCH_ERR("[GL]: sRGB FBO was requested, but it is not supported. Falling back to UNORM. Result may have banding!\n"); RARCH_ERR("[GL]: sRGB FBO was requested, but it is not supported. Falling back to UNORM. Result may have banding!\n");
} }
if (force_srgb_disable) if (force_srgb_disable)
srgb_fbo = false; srgb_fbo = false;
if (srgb_fbo && chain->has_srgb_fbo) if ( srgb_fbo
&& (chain->flags & GL2_CHAIN_FLAG_HAS_SRGB_FBO))
{ {
RARCH_LOG("[GL]: FBO pass #%d is sRGB.\n", i); RARCH_LOG("[GL]: FBO pass #%d is sRGB.\n", i);
#ifdef HAVE_OPENGLES2 #ifdef HAVE_OPENGLES2
@ -870,7 +876,9 @@ static void gl2_create_fbo_texture(gl2_t *gl,
glTexImage2D(GL_TEXTURE_2D, glTexImage2D(GL_TEXTURE_2D,
0, GL_SRGB_ALPHA_EXT, 0, GL_SRGB_ALPHA_EXT,
gl->fbo_rect[i].width, gl->fbo_rect[i].height, 0, gl->fbo_rect[i].width, gl->fbo_rect[i].height, 0,
chain->has_srgb_fbo_gles3 ? GL_RGBA : GL_SRGB_ALPHA_EXT, (chain->flags & GL2_CHAIN_FLAG_HAS_SRGB_FBO_GLES3)
? GL_RGBA
: GL_SRGB_ALPHA_EXT,
GL_UNSIGNED_BYTE, NULL); GL_UNSIGNED_BYTE, NULL);
#else #else
gl2_load_texture_image(GL_TEXTURE_2D, gl2_load_texture_image(GL_TEXTURE_2D,
@ -1062,7 +1070,7 @@ static void gl2_renderchain_start_render(
gl->coords.vertex = fbo_vertexes; gl->coords.vertex = fbo_vertexes;
#if defined(GL_FRAMEBUFFER_SRGB) && !defined(HAVE_OPENGLES) #if defined(GL_FRAMEBUFFER_SRGB) && !defined(HAVE_OPENGLES)
if (chain->has_srgb_fbo) if (chain->flags & GL2_CHAIN_FLAG_HAS_SRGB_FBO)
glEnable(GL_FRAMEBUFFER_SRGB); glEnable(GL_FRAMEBUFFER_SRGB);
#endif #endif
} }
@ -1099,7 +1107,8 @@ static void gl2_renderchain_init(
gl2_shader_scale(gl, &scaler); gl2_shader_scale(gl, &scaler);
/* we always want FBO to be at least initialized on startup for consoles */ /* we always want FBO to be at least initialized on startup for consoles */
if (shader_info.num == 1 && !scale.valid) if ( shader_info.num == 1
&& (!(scale.flags & FBO_SCALE_FLAG_VALID)))
return; return;
if (!gl->has_fbo) if (!gl->has_fbo)
@ -1109,15 +1118,16 @@ static void gl2_renderchain_init(
} }
chain->fbo_pass = shader_info.num - 1; chain->fbo_pass = shader_info.num - 1;
if (scale_last.valid) if (scale_last.flags & FBO_SCALE_FLAG_VALID)
chain->fbo_pass++; chain->fbo_pass++;
if (!scale.valid) if (!(scale.flags & FBO_SCALE_FLAG_VALID))
{ {
scale.scale_x = 1.0f; scale.scale_x = 1.0f;
scale.scale_y = 1.0f; scale.scale_y = 1.0f;
scale.type_x = scale.type_y = RARCH_SCALE_INPUT; scale.type_x = RARCH_SCALE_INPUT;
scale.valid = true; scale.type_y = RARCH_SCALE_INPUT;
scale.flags |= FBO_SCALE_FLAG_VALID;
} }
chain->fbo_scale[0] = scale; chain->fbo_scale[0] = scale;
@ -1129,12 +1139,12 @@ static void gl2_renderchain_init(
gl2_shader_scale(gl, &scaler); gl2_shader_scale(gl, &scaler);
if (!chain->fbo_scale[i].valid) if (!(chain->fbo_scale[i].flags & FBO_SCALE_FLAG_VALID))
{ {
chain->fbo_scale[i].scale_x = chain->fbo_scale[i].scale_y = 1.0f; chain->fbo_scale[i].scale_x = chain->fbo_scale[i].scale_y = 1.0f;
chain->fbo_scale[i].type_x = chain->fbo_scale[i].type_y = chain->fbo_scale[i].type_x = chain->fbo_scale[i].type_y =
RARCH_SCALE_INPUT; RARCH_SCALE_INPUT;
chain->fbo_scale[i].valid = true; chain->fbo_scale[i].flags |= FBO_SCALE_FLAG_VALID;
} }
} }
@ -1215,7 +1225,7 @@ static bool gl2_renderchain_init_hw_render(
if (depth) if (depth)
{ {
gl2_gen_rb(gl->textures, chain->hw_render_depth); gl2_gen_rb(gl->textures, chain->hw_render_depth);
chain->hw_render_depth_init = true; chain->flags |= GL2_CHAIN_FLAG_HW_RENDER_DEPTH_INIT;
} }
for (i = 0; i < gl->textures; i++) for (i = 0; i < gl->textures; i++)
@ -1438,7 +1448,7 @@ static void gl2_renderchain_copy_frame(
} }
#elif defined(HAVE_OPENGLES) #elif defined(HAVE_OPENGLES)
#if defined(HAVE_EGL) #if defined(HAVE_EGL)
if (chain->egl_images) if (chain->flags & GL2_CHAIN_FLAG_EGL_IMAGES)
{ {
bool new_egl = false; bool new_egl = false;
EGLImageKHR img = 0; EGLImageKHR img = 0;
@ -1631,7 +1641,7 @@ static void gl2_renderchain_init_texture_reference(
gl->tex_w * gl->base_size, gl->tex_w * gl->base_size,
gl->tex_w * gl->tex_h * i * gl->base_size); gl->tex_w * gl->tex_h * i * gl->base_size);
#else #else
if (chain->egl_images) if (chain->flags & GL2_CHAIN_FLAG_EGL_IMAGES)
return; return;
gl2_load_texture_image(GL_TEXTURE_2D, gl2_load_texture_image(GL_TEXTURE_2D,
@ -1655,19 +1665,33 @@ static void gl2_renderchain_resolve_extensions(gl2_t *gl,
if (!chain) if (!chain)
return; return;
chain->has_srgb_fbo = false; chain->flags &= ~GL2_CHAIN_FLAG_HAS_SRGB_FBO;
chain->has_fp_fbo = gl_check_capability(GL_CAPS_FP_FBO); if (gl_check_capability(GL_CAPS_FP_FBO))
chain->flags |= GL2_CHAIN_FLAG_HAS_FP_FBO;
else
chain->flags &= ~GL2_CHAIN_FLAG_HAS_FP_FBO;
/* GLES3 has unpack_subimage and sRGB in core. */ /* GLES3 has unpack_subimage and sRGB in core. */
chain->has_srgb_fbo_gles3 = gl_check_capability(GL_CAPS_SRGB_FBO_ES3); if (gl_check_capability(GL_CAPS_SRGB_FBO_ES3))
chain->flags |= GL2_CHAIN_FLAG_HAS_SRGB_FBO_GLES3;
else
chain->flags &= ~GL2_CHAIN_FLAG_HAS_SRGB_FBO_GLES3;
if (!force_srgb_disable) if (!force_srgb_disable)
chain->has_srgb_fbo = gl_check_capability(GL_CAPS_SRGB_FBO); {
if (gl_check_capability(GL_CAPS_SRGB_FBO))
chain->flags |= GL2_CHAIN_FLAG_HAS_SRGB_FBO;
else
chain->flags &= ~GL2_CHAIN_FLAG_HAS_SRGB_FBO;
}
/* Use regular textures if we use HW render. */ /* Use regular textures if we use HW render. */
chain->egl_images = !gl->hw_render_use if ( !gl->hw_render_use
&& gl_check_capability(GL_CAPS_EGLIMAGE) && gl_check_capability(GL_CAPS_EGLIMAGE)
&& gl->ctx_driver->image_buffer_init && gl->ctx_driver->image_buffer_init
&& gl->ctx_driver->image_buffer_init(gl->ctx_data, video); && gl->ctx_driver->image_buffer_init(gl->ctx_data, video))
chain->flags |= GL2_CHAIN_FLAG_EGL_IMAGES;
else
chain->flags &= ~GL2_CHAIN_FLAG_EGL_IMAGES;
} }
static void gl_load_texture_data( static void gl_load_texture_data(
@ -1729,10 +1753,17 @@ static void gl_load_texture_data(
glPixelStorei(GL_UNPACK_ALIGNMENT, alignment); glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
glTexImage2D(GL_TEXTURE_2D, glTexImage2D(GL_TEXTURE_2D,
0, 0,
(use_rgba || !rgb32) ? GL_RGBA : RARCH_GL_INTERNAL_FORMAT32, (use_rgba || !rgb32)
? GL_RGBA
: RARCH_GL_INTERNAL_FORMAT32,
width, height, 0, width, height, 0,
(use_rgba || !rgb32) ? GL_RGBA : RARCH_GL_TEXTURE_TYPE32, (use_rgba || !rgb32)
(rgb32) ? RARCH_GL_FORMAT32 : GL_UNSIGNED_SHORT_4_4_4_4, frame); ? GL_RGBA
: RARCH_GL_TEXTURE_TYPE32,
(rgb32)
? RARCH_GL_FORMAT32
: GL_UNSIGNED_SHORT_4_4_4_4,
frame);
if (want_mipmap && have_mipmap) if (want_mipmap && have_mipmap)
glGenerateMipmap(GL_TEXTURE_2D); glGenerateMipmap(GL_TEXTURE_2D);

View File

@ -873,10 +873,12 @@ static bool wiiu_init_frame_textures(wiiu_video_t *wiiu, unsigned width, unsigne
#if 0 #if 0
wiiu->pass[i].texture.surface.mipLevels = 1; wiiu->pass[i].texture.surface.mipLevels = 1;
#endif #endif
wiiu->pass[i].texture.surface.format = pass->fbo.fp_fbo ? wiiu->pass[i].texture.surface.format =
GX2_SURFACE_FORMAT_FLOAT_R32_G32_B32_A32 : (pass->fbo.flags & FBO_SCALE_FLAG_FP_FBO)
pass->fbo.srgb_fbo ? GX2_SURFACE_FORMAT_SRGB_R8_G8_B8_A8 : ? GX2_SURFACE_FORMAT_FLOAT_R32_G32_B32_A32
GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8; : (pass->fbo.flags & FBO_SCALE_FLAG_SRGB_FBO)
? GX2_SURFACE_FORMAT_SRGB_R8_G8_B8_A8
: GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8;
wiiu->pass[i].texture.surface.use = (GX2_SURFACE_USE_TEXTURE | wiiu->pass[i].texture.surface.use = (GX2_SURFACE_USE_TEXTURE |
GX2_SURFACE_USE_COLOR_BUFFER); GX2_SURFACE_USE_COLOR_BUFFER);
wiiu->pass[i].texture.viewNumSlices = 1; wiiu->pass[i].texture.viewNumSlices = 1;

View File

@ -2226,7 +2226,8 @@ gl3_filter_chain_t *gl3_filter_chain_create_from_preset(
if (!video_shader_load_preset_into_shader(path, shader.get())) if (!video_shader_load_preset_into_shader(path, shader.get()))
return nullptr; return nullptr;
bool last_pass_is_fbo = shader->pass[shader->passes - 1].fbo.valid; bool last_pass_is_fbo = shader->pass[shader->passes - 1].fbo.flags &
FBO_SCALE_FLAG_VALID;
std::unique_ptr<gl3_filter_chain> chain{ new gl3_filter_chain(shader->passes + (last_pass_is_fbo ? 1 : 0)) }; std::unique_ptr<gl3_filter_chain> chain{ new gl3_filter_chain(shader->passes + (last_pass_is_fbo ? 1 : 0)) };
if (!chain) if (!chain)
@ -2355,7 +2356,7 @@ gl3_filter_chain_t *gl3_filter_chain_create_from_preset(
if (output.meta.rt_format == SLANG_FORMAT_UNKNOWN) if (output.meta.rt_format == SLANG_FORMAT_UNKNOWN)
output.meta.rt_format = SLANG_FORMAT_R8G8B8A8_UNORM; output.meta.rt_format = SLANG_FORMAT_R8G8B8A8_UNORM;
if (!pass->fbo.valid) if (!(pass->fbo.flags & FBO_SCALE_FLAG_VALID))
{ {
bool scale_viewport = i + 1 == shader->passes; bool scale_viewport = i + 1 == shader->passes;
if (scale_viewport) if (scale_viewport)
@ -2390,9 +2391,9 @@ gl3_filter_chain_t *gl3_filter_chain_create_from_preset(
{ {
/* Preset overrides shader. /* Preset overrides shader.
* Kinda ugly ... */ * Kinda ugly ... */
if (pass->fbo.srgb_fbo) if (pass->fbo.flags & FBO_SCALE_FLAG_SRGB_FBO)
output.meta.rt_format = SLANG_FORMAT_R8G8B8A8_SRGB; output.meta.rt_format = SLANG_FORMAT_R8G8B8A8_SRGB;
else if (pass->fbo.fp_fbo) else if (pass->fbo.flags & FBO_SCALE_FLAG_FP_FBO)
output.meta.rt_format = SLANG_FORMAT_R16G16B16A16_SFLOAT; output.meta.rt_format = SLANG_FORMAT_R16G16B16A16_SFLOAT;
pass_info.rt_format = gl3_shader::convert_glslang_format(output.meta.rt_format); pass_info.rt_format = gl3_shader::convert_glslang_format(output.meta.rt_format);

View File

@ -1041,14 +1041,14 @@ static void *gl_glsl_init(void *data, const char *path)
if (is_preset) if (is_preset)
{ {
ret = video_shader_load_preset_into_shader(path, glsl->shader); ret = video_shader_load_preset_into_shader(path, glsl->shader);
glsl->shader->modern = true; glsl->shader->flags |= SHDR_FLAG_MODERN;
} }
else else
{ {
strlcpy(glsl->shader->pass[0].source.path, path, strlcpy(glsl->shader->pass[0].source.path, path,
sizeof(glsl->shader->pass[0].source.path)); sizeof(glsl->shader->pass[0].source.path));
glsl->shader->passes = 1; glsl->shader->passes = 1;
glsl->shader->modern = true; glsl->shader->flags |= SHDR_FLAG_MODERN;
ret = true; ret = true;
} }
@ -1071,7 +1071,7 @@ static void *gl_glsl_init(void *data, const char *path)
glsl->shader->pass[0].source.string.fragment = glsl->shader->pass[0].source.string.fragment =
strdup(glsl_core ? stock_fragment_core : stock_fragment_modern); strdup(glsl_core ? stock_fragment_core : stock_fragment_modern);
#endif #endif
glsl->shader->modern = true; glsl->shader->flags |= SHDR_FLAG_MODERN;
} }
} }
@ -1079,9 +1079,9 @@ static void *gl_glsl_init(void *data, const char *path)
stock_vertex = stock_vertex_modern; stock_vertex = stock_vertex_modern;
stock_fragment = stock_fragment_modern; stock_fragment = stock_fragment_modern;
#else #else
stock_vertex = (glsl->shader->modern) ? stock_vertex = (glsl->shader->flags & SHDR_FLAG_MODERN) ?
stock_vertex_modern : stock_vertex_legacy; stock_vertex_modern : stock_vertex_legacy;
stock_fragment = (glsl->shader->modern) ? stock_fragment = (glsl->shader->flags & SHDR_FLAG_MODERN) ?
stock_fragment_modern : stock_fragment_legacy; stock_fragment_modern : stock_fragment_legacy;
if (glsl_core) if (glsl_core)
@ -1092,13 +1092,14 @@ static void *gl_glsl_init(void *data, const char *path)
#endif #endif
#ifdef HAVE_OPENGLES #ifdef HAVE_OPENGLES
if (!glsl->shader->modern) if (!glsl->shader->flags & SHDR_FLAG_MODERN)
{ {
RARCH_ERR("[GL]: GLES context is used, but shader is not modern. Cannot use it.\n"); RARCH_ERR("[GL]: GLES context is used, but shader is not modern. Cannot use it.\n");
goto error; goto error;
} }
#else #else
if (glsl_core && !glsl->shader->modern) if ( glsl_core
&& (!(glsl->shader->flags & SHDR_FLAG_MODERN)))
{ {
RARCH_ERR("[GL]: GL core context is used, but shader is not core compatible. Cannot use it.\n"); RARCH_ERR("[GL]: GL core context is used, but shader is not core compatible. Cannot use it.\n");
goto error; goto error;
@ -1156,7 +1157,7 @@ static void *gl_glsl_init(void *data, const char *path)
glsl->prg[glsl->shader->passes + 1] = glsl->prg[0]; glsl->prg[glsl->shader->passes + 1] = glsl->prg[0];
glsl->uniforms[glsl->shader->passes + 1] = glsl->uniforms[0]; glsl->uniforms[glsl->shader->passes + 1] = glsl->uniforms[0];
if (glsl->shader->modern) if (glsl->shader->flags & SHDR_FLAG_MODERN)
{ {
#if defined(VITA) #if defined(VITA)
shader_prog_info.vertex = stock_vertex_modern_blend; shader_prog_info.vertex = stock_vertex_modern_blend;
@ -1519,7 +1520,8 @@ static bool gl_glsl_set_mvp(void *shader_data, const void *mat_data)
int loc; int loc;
glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data; glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data;
if (!glsl || !glsl->shader->modern) if ( !glsl
|| (!(glsl->shader->flags & SHDR_FLAG_MODERN)))
return false; return false;
loc = glsl->uniforms[glsl->active_idx].mvp; loc = glsl->uniforms[glsl->active_idx].mvp;
@ -1562,7 +1564,9 @@ static bool gl_glsl_set_coords(void *shader_data,
const struct shader_uniforms *uni = glsl const struct shader_uniforms *uni = glsl
? &glsl->uniforms[glsl->active_idx] : NULL; ? &glsl->uniforms[glsl->active_idx] : NULL;
if (!glsl || !glsl->shader->modern || !coords) if ( !glsl
|| (!(glsl->shader->flags & SHDR_FLAG_MODERN))
|| !coords)
{ {
if (coords) if (coords)
return false; return false;
@ -1689,9 +1693,9 @@ static void gl_glsl_shader_scale(void *data, unsigned idx, struct gfx_fbo_scale
{ {
glsl_shader_data_t *glsl = (glsl_shader_data_t*)data; glsl_shader_data_t *glsl = (glsl_shader_data_t*)data;
if (glsl && idx) if (glsl && idx)
*scale = glsl->shader->pass[idx - 1].fbo; *scale = glsl->shader->pass[idx - 1].fbo;
else else
scale->valid = false; scale->flags &= ~FBO_SCALE_FLAG_VALID;
} }
static unsigned gl_glsl_get_prev_textures(void *data) static unsigned gl_glsl_get_prev_textures(void *data)

View File

@ -2898,7 +2898,8 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
if (!video_shader_load_preset_into_shader(path, shader.get())) if (!video_shader_load_preset_into_shader(path, shader.get()))
return nullptr; return nullptr;
bool last_pass_is_fbo = shader->pass[shader->passes - 1].fbo.valid; bool last_pass_is_fbo = shader->pass[shader->passes - 1].fbo.flags &
FBO_SCALE_FLAG_VALID;
auto tmpinfo = *info; auto tmpinfo = *info;
tmpinfo.num_passes = shader->passes + (last_pass_is_fbo ? 1 : 0); tmpinfo.num_passes = shader->passes + (last_pass_is_fbo ? 1 : 0);
@ -3029,7 +3030,7 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
if (output.meta.rt_format == SLANG_FORMAT_UNKNOWN) if (output.meta.rt_format == SLANG_FORMAT_UNKNOWN)
output.meta.rt_format = SLANG_FORMAT_R8G8B8A8_UNORM; output.meta.rt_format = SLANG_FORMAT_R8G8B8A8_UNORM;
if (!pass->fbo.valid) if (!(pass->fbo.flags & FBO_SCALE_FLAG_VALID))
{ {
pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_SOURCE; pass_info.scale_type_x = GLSLANG_FILTER_CHAIN_SCALE_SOURCE;
pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_SOURCE; pass_info.scale_type_y = GLSLANG_FILTER_CHAIN_SCALE_SOURCE;
@ -3067,9 +3068,9 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset(
{ {
/* Preset overrides shader. /* Preset overrides shader.
* Kinda ugly ... */ * Kinda ugly ... */
if (pass->fbo.srgb_fbo) if (pass->fbo.flags & FBO_SCALE_FLAG_SRGB_FBO)
output.meta.rt_format = SLANG_FORMAT_R8G8B8A8_SRGB; output.meta.rt_format = SLANG_FORMAT_R8G8B8A8_SRGB;
else if (pass->fbo.fp_fbo) else if (pass->fbo.flags & FBO_SCALE_FLAG_FP_FBO)
output.meta.rt_format = SLANG_FORMAT_R16G16B16A16_SFLOAT; output.meta.rt_format = SLANG_FORMAT_R16G16B16A16_SFLOAT;
pass_info.rt_format = glslang_format_to_vk(output.meta.rt_format); pass_info.rt_format = glslang_format_to_vk(output.meta.rt_format);

View File

@ -432,9 +432,9 @@ bool slang_process(
if (out->format == SLANG_FORMAT_UNKNOWN) if (out->format == SLANG_FORMAT_UNKNOWN)
{ {
if (pass.fbo.srgb_fbo) if (pass.fbo.flags & FBO_SCALE_FLAG_SRGB_FBO)
out->format = SLANG_FORMAT_R8G8B8A8_SRGB; out->format = SLANG_FORMAT_R8G8B8A8_SRGB;
else if (pass.fbo.fp_fbo) else if (pass.fbo.flags & FBO_SCALE_FLAG_FP_FBO)
out->format = SLANG_FORMAT_R16G16B16A16_SFLOAT; out->format = SLANG_FORMAT_R16G16B16A16_SFLOAT;
else else
out->format = SLANG_FORMAT_R8G8B8A8_UNORM; out->format = SLANG_FORMAT_R8G8B8A8_UNORM;

View File

@ -276,12 +276,22 @@ static bool video_shader_parse_pass(config_file_t *conf,
strlcpy(srgb_output_buf, "srgb_framebuffer", sizeof(srgb_output_buf)); strlcpy(srgb_output_buf, "srgb_framebuffer", sizeof(srgb_output_buf));
strlcat(srgb_output_buf, formatted_num, sizeof(srgb_output_buf)); strlcat(srgb_output_buf, formatted_num, sizeof(srgb_output_buf));
if (config_get_bool(conf, srgb_output_buf, &tmp_bool)) if (config_get_bool(conf, srgb_output_buf, &tmp_bool))
pass->fbo.srgb_fbo = tmp_bool; {
if (tmp_bool)
pass->fbo.flags |= FBO_SCALE_FLAG_SRGB_FBO;
else
pass->fbo.flags &= ~FBO_SCALE_FLAG_SRGB_FBO;
}
strlcpy(fp_fbo_buf, "float_framebuffer", sizeof(fp_fbo_buf)); strlcpy(fp_fbo_buf, "float_framebuffer", sizeof(fp_fbo_buf));
strlcat(fp_fbo_buf, formatted_num, sizeof(fp_fbo_buf)); strlcat(fp_fbo_buf, formatted_num, sizeof(fp_fbo_buf));
if (config_get_bool(conf, fp_fbo_buf, &tmp_bool)) if (config_get_bool(conf, fp_fbo_buf, &tmp_bool))
pass->fbo.fp_fbo = tmp_bool; {
if (tmp_bool)
pass->fbo.flags |= FBO_SCALE_FLAG_FP_FBO;
else
pass->fbo.flags &= ~FBO_SCALE_FLAG_FP_FBO;
}
strlcpy(mipmap_buf, "mipmap_input", sizeof(mipmap_buf)); strlcpy(mipmap_buf, "mipmap_input", sizeof(mipmap_buf));
strlcat(mipmap_buf, formatted_num, sizeof(mipmap_buf)); strlcat(mipmap_buf, formatted_num, sizeof(mipmap_buf));
@ -315,7 +325,7 @@ static bool video_shader_parse_pass(config_file_t *conf,
else if (!*scale_type_x && !*scale_type_y) else if (!*scale_type_x && !*scale_type_y)
return true; return true;
scale->valid = true; scale->flags |= FBO_SCALE_FLAG_VALID;
scale->type_x = RARCH_SCALE_INPUT; scale->type_x = RARCH_SCALE_INPUT;
scale->type_y = RARCH_SCALE_INPUT; scale->type_y = RARCH_SCALE_INPUT;
scale->scale_x = 1.0; scale->scale_x = 1.0;
@ -746,12 +756,12 @@ static void shader_write_fbo(config_file_t *conf,
char key[64]; char key[64];
strlcpy(key, "float_framebuffer", sizeof(key)); strlcpy(key, "float_framebuffer", sizeof(key));
strlcat(key, formatted_num, sizeof(key)); strlcat(key, formatted_num, sizeof(key));
config_set_string(conf, key, fbo->fp_fbo ? "true" : "false"); config_set_string(conf, key, (fbo->flags & FBO_SCALE_FLAG_FP_FBO) ? "true" : "false");
strlcpy(key, "srgb_framebuffer", sizeof(key)); strlcpy(key, "srgb_framebuffer", sizeof(key));
strlcat(key, formatted_num, sizeof(key)); strlcat(key, formatted_num, sizeof(key));
config_set_string(conf, key, fbo->srgb_fbo ? "true" : "false"); config_set_string(conf, key, (fbo->flags & FBO_SCALE_FLAG_SRGB_FBO) ? "true" : "false");
if (!fbo->valid) if (!(fbo->flags & FBO_SCALE_FLAG_VALID))
return; return;
shader_write_scale_dim(conf, "x", formatted_num, fbo->type_x, fbo->scale_x, fbo->abs_x); shader_write_scale_dim(conf, "x", formatted_num, fbo->type_x, fbo->scale_x, fbo->abs_x);
@ -1419,7 +1429,8 @@ static bool video_shader_write_referenced_preset(
continue_saving_ref = false; continue_saving_ref = false;
} }
if (continue_saving_ref && fbo->fp_fbo != root_fbo->fp_fbo) if ( continue_saving_ref
&& (fbo->flags & FBO_SCALE_FLAG_FP_FBO) != (root_fbo->flags & FBO_SCALE_FLAG_FP_FBO))
{ {
#ifdef DEBUG #ifdef DEBUG
RARCH_WARN("[Shaders]: Pass %u fp_fbo", i); RARCH_WARN("[Shaders]: Pass %u fp_fbo", i);
@ -1427,7 +1438,9 @@ static bool video_shader_write_referenced_preset(
continue_saving_ref = false; continue_saving_ref = false;
} }
if (continue_saving_ref && fbo->srgb_fbo != root_fbo->srgb_fbo) if (continue_saving_ref
&& (fbo->flags & FBO_SCALE_FLAG_SRGB_FBO) != (root_fbo->flags &
FBO_SCALE_FLAG_SRGB_FBO))
{ {
#ifdef DEBUG #ifdef DEBUG
RARCH_WARN("[Shaders]: Pass %u srgb_fbo", i); RARCH_WARN("[Shaders]: Pass %u srgb_fbo", i);
@ -1435,7 +1448,8 @@ static bool video_shader_write_referenced_preset(
continue_saving_ref = false; continue_saving_ref = false;
} }
if (continue_saving_ref && fbo->valid != root_fbo->valid) if (continue_saving_ref
&& ((fbo->flags & FBO_SCALE_FLAG_VALID) != (root_fbo->flags & FBO_SCALE_FLAG_VALID)))
{ {
#ifdef DEBUG #ifdef DEBUG
RARCH_WARN("[Shaders]: Pass %u valid", i); RARCH_WARN("[Shaders]: Pass %u valid", i);
@ -2522,7 +2536,7 @@ bool apply_shader(
/* reflect in shader manager */ /* reflect in shader manager */
if (menu_shader_manager_set_preset( if (menu_shader_manager_set_preset(
shader, type, preset_path, false)) shader, type, preset_path, false))
shader->modified = false; shader->flags &= ~SHDR_FLAG_MODIFIED;
#endif #endif
} }
else else

View File

@ -80,6 +80,13 @@ enum gfx_wrap_type
RARCH_WRAP_MAX RARCH_WRAP_MAX
}; };
enum gfx_fbo_scale_flags
{
FBO_SCALE_FLAG_FP_FBO = (1 << 0),
FBO_SCALE_FLAG_SRGB_FBO = (1 << 1),
FBO_SCALE_FLAG_VALID = (1 << 2)
};
struct gfx_fbo_scale struct gfx_fbo_scale
{ {
unsigned abs_x; unsigned abs_x;
@ -88,9 +95,7 @@ struct gfx_fbo_scale
float scale_y; float scale_y;
enum gfx_scale_type type_x; enum gfx_scale_type type_x;
enum gfx_scale_type type_y; enum gfx_scale_type type_y;
bool fp_fbo; uint8_t flags;
bool srgb_fbo;
bool valid;
}; };
struct video_shader_parameter struct video_shader_parameter
@ -143,6 +148,14 @@ struct video_shader_lut
bool mipmap; bool mipmap;
}; };
enum video_shader_flags
{
SHDR_FLAG_MODERN = (1 << 0), /* Only used for XML shaders. */
/* Indicative of whether shader was modified -
* for instance from the menus */
SHDR_FLAG_MODIFIED = (1 << 1)
};
/* This is pretty big, shouldn't be put on the stack. /* This is pretty big, shouldn't be put on the stack.
* Avoid lots of allocation for convenience. */ * Avoid lots of allocation for convenience. */
struct video_shader struct video_shader
@ -160,19 +173,18 @@ struct video_shader
unsigned num_parameters; unsigned num_parameters;
unsigned variables; unsigned variables;
uint8_t flags;
char prefix[64]; char prefix[64];
/* Path to the root preset */ /* Path to the root preset */
char path[PATH_MAX_LENGTH]; char path[PATH_MAX_LENGTH];
/* Path to the original preset loaded, if this is a preset with the #reference /* Path to the original preset loaded, if this is a preset
* directive then this will be different than the path*/ * with the #reference directive, then this will be different
* than the path */
char loaded_preset_path[PATH_MAX_LENGTH]; char loaded_preset_path[PATH_MAX_LENGTH];
bool modern; /* Only used for XML shaders. */
/* indicative of whether shader was modified -
* for instance from the menus */
bool modified;
}; };

View File

@ -90,7 +90,7 @@ static int shader_action_parameter_left_internal(unsigned type, const char *labe
param_menu->current = param_prev->current; param_menu->current = param_prev->current;
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return ret; return ret;
} }
@ -307,15 +307,18 @@ static int action_left_shader_scale_pass(unsigned type, const char *label,
return menu_cbs_exit(); return menu_cbs_exit();
/* A 20x scale is used to support scaling handheld border shaders up to 8K resolutions */ /* A 20x scale is used to support scaling handheld border shaders up to 8K resolutions */
current_scale = shader_pass->fbo.scale_x; current_scale = shader_pass->fbo.scale_x;
delta = 20; delta = 20;
current_scale = (current_scale + delta) % 21; current_scale = (current_scale + delta) % 21;
shader_pass->fbo.valid = current_scale; if (current_scale)
shader_pass->fbo.scale_x = current_scale; shader_pass->fbo.flags |= FBO_SCALE_FLAG_VALID;
shader_pass->fbo.scale_y = current_scale; else
shader_pass->fbo.flags &= ~FBO_SCALE_FLAG_VALID;
shader_pass->fbo.scale_x = current_scale;
shader_pass->fbo.scale_y = current_scale;
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return 0; return 0;
} }
@ -332,7 +335,7 @@ static int action_left_shader_filter_pass(unsigned type, const char *label,
return menu_cbs_exit(); return menu_cbs_exit();
shader_pass->filter = ((shader_pass->filter + delta) % 3); shader_pass->filter = ((shader_pass->filter + delta) % 3);
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return 0; return 0;
} }
@ -384,7 +387,7 @@ static int action_left_shader_num_passes(unsigned type, const char *label,
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
video_shader_resolve_parameters(shader); video_shader_resolve_parameters(shader);
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return 0; return 0;
} }

View File

@ -2058,7 +2058,7 @@ static int generic_action_ok(const char *path,
sizeof(shader_pass->source.path)); sizeof(shader_pass->source.path));
video_shader_resolve_parameters(shader); video_shader_resolve_parameters(shader);
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
} }
} }
#endif #endif
@ -6477,11 +6477,11 @@ static int action_ok_push_dropdown_item_video_shader_num_pass(const char *path,
if (!shader) if (!shader)
return menu_cbs_exit(); return menu_cbs_exit();
shader->passes = (unsigned)idx; shader->passes = (unsigned)idx;
video_shader_resolve_parameters(shader); video_shader_resolve_parameters(shader);
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return action_cancel_pop_default(NULL, NULL, 0, 0); return action_cancel_pop_default(NULL, NULL, 0, 0);
#else #else
@ -6513,7 +6513,7 @@ static int action_ok_push_dropdown_item_video_shader_param_generic(const char *p
param_prev->current = val; param_prev->current = val;
param_menu->current = param_prev->current; param_menu->current = param_prev->current;
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return action_cancel_pop_default(NULL, NULL, 0, 0); return action_cancel_pop_default(NULL, NULL, 0, 0);
#else #else

View File

@ -89,7 +89,7 @@ static int generic_shader_action_parameter_right_internal(unsigned type, const c
ret = generic_shader_action_parameter_right(param_prev, type, label, wraparound); ret = generic_shader_action_parameter_right(param_prev, type, label, wraparound);
param_menu->current = param_prev->current; param_menu->current = param_prev->current;
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return ret; return ret;
} }
@ -349,14 +349,17 @@ static int action_right_shader_scale_pass(unsigned type, const char *label,
return menu_cbs_exit(); return menu_cbs_exit();
/* A 20x scale is used to support scaling handheld border shaders up to 8K resolutions */ /* A 20x scale is used to support scaling handheld border shaders up to 8K resolutions */
current_scale = shader_pass->fbo.scale_x; current_scale = shader_pass->fbo.scale_x;
delta = 1; delta = 1;
current_scale = (current_scale + delta) % 21; current_scale = (current_scale + delta) % 21;
shader_pass->fbo.valid = current_scale; shader_pass->fbo.scale_x = shader_pass->fbo.scale_y = current_scale;
shader_pass->fbo.scale_x = shader_pass->fbo.scale_y = current_scale; if (current_scale)
shader_pass->fbo.flags |= FBO_SCALE_FLAG_VALID;
else
shader_pass->fbo.flags &= ~FBO_SCALE_FLAG_VALID;
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return 0; return 0;
} }
@ -374,7 +377,7 @@ static int action_right_shader_filter_pass(unsigned type, const char *label,
shader_pass->filter = ((shader_pass->filter + delta) % 3); shader_pass->filter = ((shader_pass->filter + delta) % 3);
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return 0; return 0;
} }
@ -407,7 +410,7 @@ static int action_right_shader_num_passes(unsigned type, const char *label,
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);
video_shader_resolve_parameters(shader); video_shader_resolve_parameters(shader);
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return 0; return 0;
} }

View File

@ -2772,7 +2772,7 @@ int menu_shader_manager_clear_num_passes(struct video_shader *shader)
video_shader_resolve_parameters(shader); video_shader_resolve_parameters(shader);
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return 0; return 0;
} }
@ -2790,7 +2790,7 @@ int menu_shader_manager_clear_parameter(struct video_shader *shader,
param->current = MIN(MAX(param->minimum, param->current = MIN(MAX(param->minimum,
param->current), param->maximum); param->current), param->maximum);
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
return 0; return 0;
} }
@ -2805,8 +2805,7 @@ int menu_shader_manager_clear_pass_filter(struct video_shader *shader,
return -1; return -1;
shader_pass->filter = RARCH_FILTER_UNSPEC; shader_pass->filter = RARCH_FILTER_UNSPEC;
shader->flags |= SHDR_FLAG_MODIFIED;
shader->modified = true;
return 0; return 0;
} }
@ -2822,9 +2821,9 @@ void menu_shader_manager_clear_pass_scale(struct video_shader *shader,
shader_pass->fbo.scale_x = 0; shader_pass->fbo.scale_x = 0;
shader_pass->fbo.scale_y = 0; shader_pass->fbo.scale_y = 0;
shader_pass->fbo.valid = false; shader_pass->fbo.flags &= ~FBO_SCALE_FLAG_VALID;
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
} }
void menu_shader_manager_clear_pass_path(struct video_shader *shader, void menu_shader_manager_clear_pass_path(struct video_shader *shader,
@ -2839,7 +2838,7 @@ void menu_shader_manager_clear_pass_path(struct video_shader *shader,
*shader_pass->source.path = '\0'; *shader_pass->source.path = '\0';
if (shader) if (shader)
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
} }
/** /**
@ -7315,7 +7314,7 @@ bool menu_shader_manager_init(void)
ret = false; ret = false;
goto end; goto end;
} }
menu_shader->modified = false; menu_shader->flags &= ~SHDR_FLAG_MODIFIED;
} }
else else
{ {

View File

@ -7817,7 +7817,7 @@ static void general_write_handler(rarch_setting_t *setting)
struct video_shader *shader = menu_shader_get(); struct video_shader *shader = menu_shader_get();
shader->passes = 0; shader->passes = 0;
shader->modified = true; shader->flags |= SHDR_FLAG_MODIFIED;
menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL); menu_driver_ctl(RARCH_MENU_CTL_SET_PREVENT_POPULATE, NULL);

View File

@ -1509,7 +1509,7 @@ void ShaderParamsDialog::onFilterComboBoxIndexChanged(int)
if (video_shader) if (video_shader)
video_shader->pass[pass].filter = filter; video_shader->pass[pass].filter = filter;
video_shader->modified = true; video_shader->flags |= SHDR_FLAG_MODIFIED;
command_event(CMD_EVENT_SHADERS_APPLY_CHANGES, NULL); command_event(CMD_EVENT_SHADERS_APPLY_CHANGES, NULL);
} }
@ -1553,19 +1553,25 @@ void ShaderParamsDialog::onScaleComboBoxIndexChanged(int)
{ {
if (menu_shader) if (menu_shader)
{ {
menu_shader->pass[pass].fbo.scale_x = scale; menu_shader->pass[pass].fbo.scale_x = scale;
menu_shader->pass[pass].fbo.scale_y = scale; menu_shader->pass[pass].fbo.scale_y = scale;
menu_shader->pass[pass].fbo.valid = scale; if (scale)
menu_shader->pass[pass].fbo.flags |= FBO_SCALE_FLAG_VALID;
else
menu_shader->pass[pass].fbo.flags &= ~FBO_SCALE_FLAG_VALID;
} }
if (video_shader) if (video_shader)
{ {
video_shader->pass[pass].fbo.scale_x = scale; video_shader->pass[pass].fbo.scale_x = scale;
video_shader->pass[pass].fbo.scale_y = scale; video_shader->pass[pass].fbo.scale_y = scale;
video_shader->pass[pass].fbo.valid = scale; if (scale)
video_shader->pass[pass].fbo.flags |= FBO_SCALE_FLAG_VALID;
else
video_shader->pass[pass].fbo.flags &= ~FBO_SCALE_FLAG_VALID;
} }
video_shader->modified = true; video_shader->flags |= SHDR_FLAG_MODIFIED;
command_event(CMD_EVENT_SHADERS_APPLY_CHANGES, NULL); command_event(CMD_EVENT_SHADERS_APPLY_CHANGES, NULL);
} }
@ -1643,7 +1649,7 @@ void ShaderParamsDialog::onShaderPassMoveDownClicked()
memcpy(&menu_shader->pass[pass + 1], tempPass.pass, sizeof(struct video_shader_pass)); memcpy(&menu_shader->pass[pass + 1], tempPass.pass, sizeof(struct video_shader_pass));
} }
menu_shader->modified = true; menu_shader->flags |= SHDR_FLAG_MODIFIED;
reload(); reload();
} }
@ -1718,7 +1724,7 @@ void ShaderParamsDialog::onShaderPassMoveUpClicked()
memcpy(&menu_shader->pass[pass], tempPass.pass, sizeof(struct video_shader_pass)); memcpy(&menu_shader->pass[pass], tempPass.pass, sizeof(struct video_shader_pass));
} }
menu_shader->modified = true; menu_shader->flags |= SHDR_FLAG_MODIFIED;
reload(); reload();
} }
@ -1825,7 +1831,7 @@ void ShaderParamsDialog::onShaderResetPass(int pass)
param->current = param->initial; param->current = param->initial;
} }
video_shader->modified = true; video_shader->flags |= SHDR_FLAG_MODIFIED;
} }
reload(); reload();
@ -1871,7 +1877,7 @@ void ShaderParamsDialog::onShaderResetParameter(QString parameter)
if (param) if (param)
param->current = param->initial; param->current = param->initial;
video_shader->modified = true; video_shader->flags |= SHDR_FLAG_MODIFIED;
} }
reload(); reload();
@ -1941,7 +1947,7 @@ void ShaderParamsDialog::onShaderAddPassClicked()
else else
return; return;
menu_shader->modified = true; menu_shader->flags |= SHDR_FLAG_MODIFIED;
shader_pass = &menu_shader->pass[menu_shader->passes - 1]; shader_pass = &menu_shader->pass[menu_shader->passes - 1];
if (!shader_pass) if (!shader_pass)
@ -2122,7 +2128,7 @@ void ShaderParamsDialog::onShaderRemoveAllPassesClicked()
return; return;
menu_shader->passes = 0; menu_shader->passes = 0;
menu_shader->modified = true; menu_shader->flags |= SHDR_FLAG_MODIFIED;
onShaderApplyClicked(); onShaderApplyClicked();
} }
@ -2169,7 +2175,7 @@ void ShaderParamsDialog::onShaderRemovePass(int pass)
menu_shader->passes--; menu_shader->passes--;
menu_shader->modified = true; menu_shader->flags |= SHDR_FLAG_MODIFIED;
onShaderApplyClicked(); onShaderApplyClicked();
} }
@ -2721,7 +2727,7 @@ void ShaderParamsDialog::onShaderParamCheckBoxClicked()
param->current = (checkBox->isChecked() ? param->maximum : param->minimum); param->current = (checkBox->isChecked() ? param->maximum : param->minimum);
} }
video_shader->modified = true; video_shader->flags |= SHDR_FLAG_MODIFIED;
} }
} }
@ -2787,7 +2793,7 @@ void ShaderParamsDialog::onShaderParamSliderValueChanged(int)
param->current = newValue; param->current = newValue;
} }
video_shader->modified = true; video_shader->flags |= SHDR_FLAG_MODIFIED;
} }
} }
@ -2895,7 +2901,7 @@ void ShaderParamsDialog::onShaderParamSpinBoxValueChanged(int value)
slider->blockSignals(false); slider->blockSignals(false);
} }
video_shader->modified = true; video_shader->flags |= SHDR_FLAG_MODIFIED;
} }
} }
} }
@ -2978,7 +2984,7 @@ void ShaderParamsDialog::onShaderParamDoubleSpinBoxValueChanged(double value)
slider->blockSignals(false); slider->blockSignals(false);
} }
video_shader->modified = true; video_shader->flags |= SHDR_FLAG_MODIFIED;
} }
} }
} }