浏览代码

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

jp9000 5 年之前
父节点
当前提交
6ca52db8ce
共有 2 个文件被更改,包括 50 次插入0 次删除
  1. 48 0
      libobs-opengl/gl-shaderparser.c
  2. 2 0
      libobs-opengl/gl-shaderparser.h

+ 48 - 0
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)

+ 2 - 0
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)