From 6ca52db8ce984579d733d74cf69d1b59716277bc Mon Sep 17 00:00:00 2001 From: jp9000 Date: Tue, 7 Apr 2020 23:52:28 -0700 Subject: [PATCH] libobs-opengl: Add sincos to HLSL->GLSL transpile --- libobs-opengl/gl-shaderparser.c | 48 +++++++++++++++++++++++++++++++++ libobs-opengl/gl-shaderparser.h | 2 ++ 2 files changed, 50 insertions(+) diff --git a/libobs-opengl/gl-shaderparser.c b/libobs-opengl/gl-shaderparser.c index f66e8525..d4cfcee4 100644 --- a/libobs-opengl/gl-shaderparser.c +++ b/libobs-opengl/gl-shaderparser.c @@ -270,6 +270,7 @@ static inline void gl_write_structs(struct gl_shader_parser *glsp) * mul -> (change to operator) * rsqrt -> inversesqrt * saturate -> (use clamp) + * sincos -> (map to manual sin/cos calls) * tex* -> texture * tex*grad -> textureGrad * tex*lod -> textureLod @@ -301,6 +302,51 @@ static bool gl_write_mul(struct gl_shader_parser *glsp, return true; } +static bool gl_write_sincos(struct gl_shader_parser *glsp, + struct cf_token **p_token) +{ + struct cf_parser *cfp = &glsp->parser.cfp; + struct dstr var = {0}; + bool success = false; + + cfp->cur_token = *p_token; + + if (!cf_next_token(cfp)) + return false; + if (!cf_token_is(cfp, "(")) + return false; + + dstr_printf(&var, "sincos_var_internal_%d", glsp->sincos_counter++); + + dstr_cat(&glsp->gl_string, "float "); + dstr_cat_dstr(&glsp->gl_string, &var); + dstr_cat(&glsp->gl_string, " = "); + gl_write_function_contents(glsp, &cfp->cur_token, ","); + dstr_cat(&glsp->gl_string, "); "); + + if (!cf_next_token(cfp)) + goto fail; + gl_write_function_contents(glsp, &cfp->cur_token, ","); + dstr_cat(&glsp->gl_string, " = sin("); + dstr_cat_dstr(&glsp->gl_string, &var); + dstr_cat(&glsp->gl_string, "); "); + + if (!cf_next_token(cfp)) + goto fail; + gl_write_function_contents(glsp, &cfp->cur_token, ")"); + dstr_cat(&glsp->gl_string, " = cos("); + dstr_cat_dstr(&glsp->gl_string, &var); + dstr_cat(&glsp->gl_string, ")"); + + success = true; + +fail: + dstr_free(&var); + + *p_token = cfp->cur_token; + return success; +} + static bool gl_write_saturate(struct gl_shader_parser *glsp, struct cf_token **p_token) { @@ -421,6 +467,8 @@ static bool gl_write_intrinsic(struct gl_shader_parser *glsp, 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 { struct shader_var *var = sp_getparam(glsp, token); if (var && astrcmp_n(var->type, "texture", 7) == 0) diff --git a/libobs-opengl/gl-shaderparser.h b/libobs-opengl/gl-shaderparser.h index 0667aa58..af837fc4 100644 --- a/libobs-opengl/gl-shaderparser.h +++ b/libobs-opengl/gl-shaderparser.h @@ -48,6 +48,7 @@ struct gl_shader_parser { const char *output_prefix; struct shader_parser parser; struct dstr gl_string; + int sincos_counter; DARRAY(uint32_t) texture_samplers; DARRAY(struct gl_parser_attrib) attribs; @@ -70,6 +71,7 @@ static inline void gl_shader_parser_init(struct gl_shader_parser *glsp, dstr_init(&glsp->gl_string); da_init(glsp->texture_samplers); da_init(glsp->attribs); + glsp->sincos_counter = 1; } static inline void gl_shader_parser_free(struct gl_shader_parser *glsp) -- GitLab