Implement dFdx, dFdy, and fwidth via new expression opcodes.

This commit is contained in:
Kenneth Graunke
2010-06-09 14:42:41 -07:00
parent cbd881da3f
commit b843c7a20c
4 changed files with 163 additions and 0 deletions
+77
View File
@@ -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,
};
+73
View File
@@ -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)))))))
))
+5
View File
@@ -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",
"+",
"-",
"*",
+8
View File
@@ -494,6 +494,14 @@ enum ir_expression_operation {
ir_unop_cos,
/*@}*/
/**
* \name Partial derivatives.
*/
/*@{*/
ir_unop_dFdx,
ir_unop_dFdy,
/*@}*/
ir_binop_add,
ir_binop_sub,
ir_binop_mul,