提交 6ca52db8 编写于 作者: J jp9000

libobs-opengl: Add sincos to HLSL->GLSL transpile

上级 bc7dd6e9
......@@ -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)
......
......@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册