Cleanup: Move specific node tree execution functions into respective module
`node_exec` had some code that was specific to texture/shader nodes. These functions arent used outside there module so limit there declarations. Also make a function static that is only used in `node_exec.c` Reviewed By: JacquesLucke Differential Revision: https://developer.blender.org/D13899
This commit is contained in:
parent
cab1f1d9a2
commit
710e46cb2d
|
@ -35,7 +35,7 @@
|
|||
#include "node_exec.h"
|
||||
#include "node_util.h"
|
||||
|
||||
int node_exec_socket_use_stack(bNodeSocket *sock)
|
||||
static int node_exec_socket_use_stack(bNodeSocket *sock)
|
||||
{
|
||||
/* NOTE: INT supported as FLOAT. Only for EEVEE. */
|
||||
return ELEM(sock->type, SOCK_INT, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, SOCK_SHADER);
|
||||
|
@ -276,60 +276,3 @@ void ntree_exec_end(bNodeTreeExec *exec)
|
|||
|
||||
MEM_freeN(exec);
|
||||
}
|
||||
|
||||
/**** Material/Texture trees ****/
|
||||
|
||||
bNodeThreadStack *ntreeGetThreadStack(bNodeTreeExec *exec, int thread)
|
||||
{
|
||||
ListBase *lb = &exec->threadstack[thread];
|
||||
bNodeThreadStack *nts;
|
||||
|
||||
for (nts = (bNodeThreadStack *)lb->first; nts; nts = nts->next) {
|
||||
if (!nts->used) {
|
||||
nts->used = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!nts) {
|
||||
nts = MEM_cnew<bNodeThreadStack>("bNodeThreadStack");
|
||||
nts->stack = (bNodeStack *)MEM_dupallocN(exec->stack);
|
||||
nts->used = true;
|
||||
BLI_addtail(lb, nts);
|
||||
}
|
||||
|
||||
return nts;
|
||||
}
|
||||
|
||||
void ntreeReleaseThreadStack(bNodeThreadStack *nts)
|
||||
{
|
||||
nts->used = false;
|
||||
}
|
||||
|
||||
bool ntreeExecThreadNodes(bNodeTreeExec *exec, bNodeThreadStack *nts, void *callerdata, int thread)
|
||||
{
|
||||
bNodeStack *nsin[MAX_SOCKET] = {nullptr}; /* arbitrary... watch this */
|
||||
bNodeStack *nsout[MAX_SOCKET] = {nullptr}; /* arbitrary... watch this */
|
||||
bNodeExec *nodeexec;
|
||||
bNode *node;
|
||||
int n;
|
||||
|
||||
/* nodes are presorted, so exec is in order of list */
|
||||
|
||||
for (n = 0, nodeexec = exec->nodeexec; n < exec->totnodes; n++, nodeexec++) {
|
||||
node = nodeexec->node;
|
||||
if (node->need_exec) {
|
||||
node_get_stack(node, nts->stack, nsin, nsout);
|
||||
/* Handle muted nodes...
|
||||
* If the mute func is not set, assume the node should never be muted,
|
||||
* and hence execute it!
|
||||
*/
|
||||
if (node->typeinfo->exec_fn && !(node->flag & NODE_MUTED)) {
|
||||
node->typeinfo->exec_fn(callerdata, thread, node, &nodeexec->data, nsin, nsout);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* signal to that all went OK, for render */
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -71,9 +71,6 @@ typedef struct bNodeThreadStack {
|
|||
bool used;
|
||||
} bNodeThreadStack;
|
||||
|
||||
/** Supported socket types in old nodes. */
|
||||
int node_exec_socket_use_stack(struct bNodeSocket *sock);
|
||||
|
||||
/** For a given socket, find the actual stack entry. */
|
||||
struct bNodeStack *node_get_socket_stack(struct bNodeStack *stack, struct bNodeSocket *sock);
|
||||
void node_get_stack(struct bNode *node,
|
||||
|
@ -86,23 +83,6 @@ struct bNodeTreeExec *ntree_exec_begin(struct bNodeExecContext *context,
|
|||
bNodeInstanceKey parent_key);
|
||||
void ntree_exec_end(struct bNodeTreeExec *exec);
|
||||
|
||||
struct bNodeThreadStack *ntreeGetThreadStack(struct bNodeTreeExec *exec, int thread);
|
||||
void ntreeReleaseThreadStack(struct bNodeThreadStack *nts);
|
||||
bool ntreeExecThreadNodes(struct bNodeTreeExec *exec,
|
||||
struct bNodeThreadStack *nts,
|
||||
void *callerdata,
|
||||
int thread);
|
||||
|
||||
struct bNodeTreeExec *ntreeShaderBeginExecTree_internal(struct bNodeExecContext *context,
|
||||
struct bNodeTree *ntree,
|
||||
bNodeInstanceKey parent_key);
|
||||
void ntreeShaderEndExecTree_internal(struct bNodeTreeExec *exec);
|
||||
|
||||
struct bNodeTreeExec *ntreeTexBeginExecTree_internal(struct bNodeExecContext *context,
|
||||
struct bNodeTree *ntree,
|
||||
bNodeInstanceKey parent_key);
|
||||
void ntreeTexEndExecTree_internal(struct bNodeTreeExec *exec);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -101,6 +101,11 @@ void node_shader_gpu_tex_mapping(struct GPUMaterial *mat,
|
|||
struct GPUNodeStack *in,
|
||||
struct GPUNodeStack *out);
|
||||
|
||||
struct bNodeTreeExec *ntreeShaderBeginExecTree_internal(struct bNodeExecContext *context,
|
||||
struct bNodeTree *ntree,
|
||||
bNodeInstanceKey parent_key);
|
||||
void ntreeShaderEndExecTree_internal(struct bNodeTreeExec *exec);
|
||||
|
||||
void ntreeExecGPUNodes(struct bNodeTreeExec *exec,
|
||||
struct GPUMaterial *mat,
|
||||
struct bNode *output_node);
|
||||
|
|
|
@ -170,6 +170,63 @@ void register_node_tree_type_tex(void)
|
|||
ntreeTypeAdd(tt);
|
||||
}
|
||||
|
||||
/**** Material/Texture trees ****/
|
||||
|
||||
bNodeThreadStack *ntreeGetThreadStack(bNodeTreeExec *exec, int thread)
|
||||
{
|
||||
ListBase *lb = &exec->threadstack[thread];
|
||||
bNodeThreadStack *nts;
|
||||
|
||||
for (nts = (bNodeThreadStack *)lb->first; nts; nts = nts->next) {
|
||||
if (!nts->used) {
|
||||
nts->used = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!nts) {
|
||||
nts = MEM_callocN(sizeof(bNodeThreadStack), "bNodeThreadStack");
|
||||
nts->stack = (bNodeStack *)MEM_dupallocN(exec->stack);
|
||||
nts->used = true;
|
||||
BLI_addtail(lb, nts);
|
||||
}
|
||||
|
||||
return nts;
|
||||
}
|
||||
|
||||
void ntreeReleaseThreadStack(bNodeThreadStack *nts)
|
||||
{
|
||||
nts->used = false;
|
||||
}
|
||||
|
||||
bool ntreeExecThreadNodes(bNodeTreeExec *exec, bNodeThreadStack *nts, void *callerdata, int thread)
|
||||
{
|
||||
bNodeStack *nsin[MAX_SOCKET] = {NULL}; /* arbitrary... watch this */
|
||||
bNodeStack *nsout[MAX_SOCKET] = {NULL}; /* arbitrary... watch this */
|
||||
bNodeExec *nodeexec;
|
||||
bNode *node;
|
||||
int n;
|
||||
|
||||
/* nodes are presorted, so exec is in order of list */
|
||||
|
||||
for (n = 0, nodeexec = exec->nodeexec; n < exec->totnodes; n++, nodeexec++) {
|
||||
node = nodeexec->node;
|
||||
if (node->need_exec) {
|
||||
node_get_stack(node, nts->stack, nsin, nsout);
|
||||
/* Handle muted nodes...
|
||||
* If the mute func is not set, assume the node should never be muted,
|
||||
* and hence execute it!
|
||||
*/
|
||||
if (node->typeinfo->exec_fn && !(node->flag & NODE_MUTED)) {
|
||||
node->typeinfo->exec_fn(callerdata, thread, node, &nodeexec->data, nsin, nsout);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* signal to that all went OK, for render */
|
||||
return true;
|
||||
}
|
||||
|
||||
bNodeTreeExec *ntreeTexBeginExecTree_internal(bNodeExecContext *context,
|
||||
bNodeTree *ntree,
|
||||
bNodeInstanceKey parent_key)
|
||||
|
|
|
@ -123,6 +123,18 @@ void tex_output(bNode *node,
|
|||
|
||||
void params_from_cdata(TexParams *out, TexCallData *in);
|
||||
|
||||
struct bNodeThreadStack *ntreeGetThreadStack(struct bNodeTreeExec *exec, int thread);
|
||||
void ntreeReleaseThreadStack(struct bNodeThreadStack *nts);
|
||||
bool ntreeExecThreadNodes(struct bNodeTreeExec *exec,
|
||||
struct bNodeThreadStack *nts,
|
||||
void *callerdata,
|
||||
int thread);
|
||||
|
||||
struct bNodeTreeExec *ntreeTexBeginExecTree_internal(struct bNodeExecContext *context,
|
||||
struct bNodeTree *ntree,
|
||||
bNodeInstanceKey parent_key);
|
||||
void ntreeTexEndExecTree_internal(struct bNodeTreeExec *exec);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue