Implement dFdx, dFdy, and fwidth via new expression opcodes.
This commit is contained in:
@@ -2496,6 +2496,82 @@ static const char *functions_for_110 [] = {
|
||||
|
||||
/* 110_fs builtins */
|
||||
|
||||
static const char *builtins_110_fs_derivatives = {
|
||||
"((function dFdx\n"
|
||||
" (signature float\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) float p))\n"
|
||||
" ((return (expression float dFdx (var_ref p)))))\n"
|
||||
"\n"
|
||||
" (signature vec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec2 p))\n"
|
||||
" ((return (expression vec2 dFdx (var_ref p)))))\n"
|
||||
"\n"
|
||||
" (signature vec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec3 p))\n"
|
||||
" ((return (expression vec3 dFdx (var_ref p)))))\n"
|
||||
"\n"
|
||||
" (signature vec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec4 p))\n"
|
||||
" ((return (expression vec4 dFdx (var_ref p)))))\n"
|
||||
" )\n"
|
||||
"\n"
|
||||
" (function dFdy\n"
|
||||
" (signature float\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) float p))\n"
|
||||
" ((return (expression float dFdy (var_ref p)))))\n"
|
||||
"\n"
|
||||
" (signature vec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec2 p))\n"
|
||||
" ((return (expression vec2 dFdy (var_ref p)))))\n"
|
||||
"\n"
|
||||
" (signature vec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec3 p))\n"
|
||||
" ((return (expression vec3 dFdy (var_ref p)))))\n"
|
||||
"\n"
|
||||
" (signature vec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec4 p))\n"
|
||||
" ((return (expression vec4 dFdy (var_ref p)))))\n"
|
||||
" )\n"
|
||||
"\n"
|
||||
" (function fwidth\n"
|
||||
" (signature float\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) float p))\n"
|
||||
" ((return (expression float +\n"
|
||||
" (expression float abs (expression float dFdx (var_ref p)))\n"
|
||||
" (expression float abs (expression float dFdy (var_ref p)))))))\n"
|
||||
"\n"
|
||||
" (signature vec2\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec2 p))\n"
|
||||
" ((return (expression vec2 +\n"
|
||||
" (expression vec2 abs (expression vec2 dFdx (var_ref p)))\n"
|
||||
" (expression vec2 abs (expression vec2 dFdy (var_ref p)))))))\n"
|
||||
"\n"
|
||||
" (signature vec3\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec3 p))\n"
|
||||
" ((return (expression vec3 +\n"
|
||||
" (expression vec3 abs (expression vec3 dFdx (var_ref p)))\n"
|
||||
" (expression vec3 abs (expression vec3 dFdy (var_ref p)))))))\n"
|
||||
"\n"
|
||||
" (signature vec4\n"
|
||||
" (parameters\n"
|
||||
" (declare (in) vec4 p))\n"
|
||||
" ((return (expression vec4 +\n"
|
||||
" (expression vec4 abs (expression vec4 dFdx (var_ref p)))\n"
|
||||
" (expression vec4 abs (expression vec4 dFdy (var_ref p)))))))\n"
|
||||
"))\n"
|
||||
};
|
||||
|
||||
static const char *builtins_110_fs_textures = {
|
||||
"((function texture1D\n"
|
||||
" (signature vec4\n"
|
||||
@@ -2613,6 +2689,7 @@ static const char *builtins_110_fs_textures = {
|
||||
};
|
||||
|
||||
static const char *functions_for_110_fs [] = {
|
||||
builtins_110_fs_derivatives,
|
||||
builtins_110_fs_textures,
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
((function dFdx
|
||||
(signature float
|
||||
(parameters
|
||||
(declare (in) float p))
|
||||
((return (expression float dFdx (var_ref p)))))
|
||||
|
||||
(signature vec2
|
||||
(parameters
|
||||
(declare (in) vec2 p))
|
||||
((return (expression vec2 dFdx (var_ref p)))))
|
||||
|
||||
(signature vec3
|
||||
(parameters
|
||||
(declare (in) vec3 p))
|
||||
((return (expression vec3 dFdx (var_ref p)))))
|
||||
|
||||
(signature vec4
|
||||
(parameters
|
||||
(declare (in) vec4 p))
|
||||
((return (expression vec4 dFdx (var_ref p)))))
|
||||
)
|
||||
|
||||
(function dFdy
|
||||
(signature float
|
||||
(parameters
|
||||
(declare (in) float p))
|
||||
((return (expression float dFdy (var_ref p)))))
|
||||
|
||||
(signature vec2
|
||||
(parameters
|
||||
(declare (in) vec2 p))
|
||||
((return (expression vec2 dFdy (var_ref p)))))
|
||||
|
||||
(signature vec3
|
||||
(parameters
|
||||
(declare (in) vec3 p))
|
||||
((return (expression vec3 dFdy (var_ref p)))))
|
||||
|
||||
(signature vec4
|
||||
(parameters
|
||||
(declare (in) vec4 p))
|
||||
((return (expression vec4 dFdy (var_ref p)))))
|
||||
)
|
||||
|
||||
(function fwidth
|
||||
(signature float
|
||||
(parameters
|
||||
(declare (in) float p))
|
||||
((return (expression float +
|
||||
(expression float abs (expression float dFdx (var_ref p)))
|
||||
(expression float abs (expression float dFdy (var_ref p)))))))
|
||||
|
||||
(signature vec2
|
||||
(parameters
|
||||
(declare (in) vec2 p))
|
||||
((return (expression vec2 +
|
||||
(expression vec2 abs (expression vec2 dFdx (var_ref p)))
|
||||
(expression vec2 abs (expression vec2 dFdy (var_ref p)))))))
|
||||
|
||||
(signature vec3
|
||||
(parameters
|
||||
(declare (in) vec3 p))
|
||||
((return (expression vec3 +
|
||||
(expression vec3 abs (expression vec3 dFdx (var_ref p)))
|
||||
(expression vec3 abs (expression vec3 dFdy (var_ref p)))))))
|
||||
|
||||
(signature vec4
|
||||
(parameters
|
||||
(declare (in) vec4 p))
|
||||
((return (expression vec4 +
|
||||
(expression vec4 abs (expression vec4 dFdx (var_ref p)))
|
||||
(expression vec4 abs (expression vec4 dFdy (var_ref p)))))))
|
||||
))
|
||||
@@ -76,6 +76,9 @@ ir_expression::get_num_operands(ir_expression_operation op)
|
||||
1, /* ir_unop_sin */
|
||||
1, /* ir_unop_cos */
|
||||
|
||||
1, /* ir_unop_dFdx */
|
||||
1, /* ir_unop_dFdy */
|
||||
|
||||
2, /* ir_binop_add */
|
||||
2, /* ir_binop_sub */
|
||||
2, /* ir_binop_mul */
|
||||
@@ -136,6 +139,8 @@ static const char *const operator_strs[] = {
|
||||
"floor",
|
||||
"sin",
|
||||
"cos",
|
||||
"dFdx",
|
||||
"dFdy",
|
||||
"+",
|
||||
"-",
|
||||
"*",
|
||||
|
||||
Reference in New Issue
Block a user