From 0934e73902e308d87674c926723cb630b0d1322a Mon Sep 17 00:00:00 2001 From: jpark37 Date: Sat, 1 Apr 2023 17:22:02 -0700 Subject: [PATCH] libobs-opengl: Support mad/uint2/uint3/uint4 --- libobs-opengl/gl-shaderparser.c | 43 ++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/libobs-opengl/gl-shaderparser.c b/libobs-opengl/gl-shaderparser.c index 0361b2eab..49f48859b 100644 --- a/libobs-opengl/gl-shaderparser.c +++ b/libobs-opengl/gl-shaderparser.c @@ -71,6 +71,12 @@ static bool gl_write_type_n(struct gl_shader_parser *glsp, const char *type, dstr_cat(&glsp->gl_string, "ivec3"); else if (cmp_type(type, len, "int4", 4) == 0) dstr_cat(&glsp->gl_string, "ivec4"); + else if (cmp_type(type, len, "uint2", 5) == 0) + dstr_cat(&glsp->gl_string, "uvec2"); + else if (cmp_type(type, len, "uint3", 5) == 0) + dstr_cat(&glsp->gl_string, "uvec3"); + else if (cmp_type(type, len, "uint4", 5) == 0) + dstr_cat(&glsp->gl_string, "uvec4"); else if (cmp_type(type, len, "float3x3", 8) == 0) dstr_cat(&glsp->gl_string, "mat3x3"); else if (cmp_type(type, len, "float3x4", 8) == 0) @@ -267,6 +273,7 @@ static inline void gl_write_structs(struct gl_shader_parser *glsp) * lerp -> mix * lit -> (unsupported) * log10 -> (unsupported) + * mad -> (change to operator) [fma needs GLSL 400] * mul -> (change to operator) * rsqrt -> inversesqrt * saturate -> (use clamp) @@ -280,6 +287,31 @@ static inline void gl_write_structs(struct gl_shader_parser *glsp) * All else can be left as-is */ +static bool gl_write_mad(struct gl_shader_parser *glsp, + struct cf_token **p_token) +{ + struct cf_parser *cfp = &glsp->parser.cfp; + cfp->cur_token = *p_token; + + if (!cf_next_token(cfp)) + return false; + if (!cf_token_is(cfp, "(")) + return false; + + dstr_cat(&glsp->gl_string, "("); + gl_write_function_contents(glsp, &cfp->cur_token, ","); + dstr_cat(&glsp->gl_string, ") * ("); + cf_next_token(cfp); + gl_write_function_contents(glsp, &cfp->cur_token, ","); + dstr_cat(&glsp->gl_string, ") + ("); + cf_next_token(cfp); + gl_write_function_contents(glsp, &cfp->cur_token, ")"); + dstr_cat(&glsp->gl_string, "))"); + + *p_token = cfp->cur_token; + return true; +} + static bool gl_write_mul(struct gl_shader_parser *glsp, struct cf_token **p_token) { @@ -456,18 +488,21 @@ static bool gl_write_intrinsic(struct gl_shader_parser *glsp, dstr_cat(&glsp->gl_string, "dFdx"); } else if (strref_cmp(&token->str, "ddy") == 0) { dstr_cat(&glsp->gl_string, "dFdy"); + } else if (strref_cmp(&token->str, "fmod") == 0) { + dstr_cat(&glsp->gl_string, "mod"); } else if (strref_cmp(&token->str, "frac") == 0) { dstr_cat(&glsp->gl_string, "fract"); } else if (strref_cmp(&token->str, "lerp") == 0) { dstr_cat(&glsp->gl_string, "mix"); - } else if (strref_cmp(&token->str, "fmod") == 0) { - dstr_cat(&glsp->gl_string, "mod"); + } else if (strref_cmp(&token->str, "mad") == 0) { + /* fma not available in GLSL 330 */ + written = gl_write_mad(glsp, &token); + } else if (strref_cmp(&token->str, "mul") == 0) { + written = gl_write_mul(glsp, &token); } else if (strref_cmp(&token->str, "rsqrt") == 0) { dstr_cat(&glsp->gl_string, "inversesqrt"); } else if (strref_cmp(&token->str, "saturate") == 0) { written = gl_write_saturate(glsp, &token); - } else if (strref_cmp(&token->str, "mul") == 0) { - written = gl_write_mul(glsp, &token); } else if (strref_cmp(&token->str, "sincos") == 0) { written = gl_write_sincos(glsp, &token); } else {