GPUMaterial: Make Localize tree live longer
This is in order to reference the localized node->storage when populating the UBO data.
This commit is contained in:
@@ -811,7 +811,7 @@ void ntreeShaderEndExecTree(struct bNodeTreeExec *exec);
|
|||||||
bool ntreeShaderExecTree(struct bNodeTree *ntree, int thread);
|
bool ntreeShaderExecTree(struct bNodeTree *ntree, int thread);
|
||||||
struct bNode *ntreeShaderOutputNode(struct bNodeTree *ntree, int target);
|
struct bNode *ntreeShaderOutputNode(struct bNodeTree *ntree, int target);
|
||||||
|
|
||||||
void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat,
|
void ntreeGPUMaterialNodes(struct bNodeTree *localtree, struct GPUMaterial *mat,
|
||||||
bool *has_surface_output, bool *has_volume_output);
|
bool *has_surface_output, bool *has_volume_output);
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
|||||||
@@ -595,7 +595,9 @@ GPUMaterial *GPU_material_from_nodetree(
|
|||||||
mat->engine_type = engine_type;
|
mat->engine_type = engine_type;
|
||||||
mat->options = options;
|
mat->options = options;
|
||||||
|
|
||||||
ntreeGPUMaterialNodes(ntree, mat, &has_surface_output, &has_volume_output);
|
/* localize tree to create links for reroute and mute */
|
||||||
|
bNodeTree *localtree = ntreeLocalize(ntree);
|
||||||
|
ntreeGPUMaterialNodes(localtree, mat, &has_surface_output, &has_volume_output);
|
||||||
|
|
||||||
if (has_surface_output) {
|
if (has_surface_output) {
|
||||||
mat->domain |= GPU_DOMAIN_SURFACE;
|
mat->domain |= GPU_DOMAIN_SURFACE;
|
||||||
@@ -640,6 +642,11 @@ GPUMaterial *GPU_material_from_nodetree(
|
|||||||
mat->status = GPU_MAT_FAILED;
|
mat->status = GPU_MAT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Only free after GPU_pass_shader_get where GPUUniformBuffer
|
||||||
|
* read data from the local tree. */
|
||||||
|
ntreeFreeTree(localtree);
|
||||||
|
MEM_freeN(localtree);
|
||||||
|
|
||||||
/* note that even if building the shader fails in some way, we still keep
|
/* note that even if building the shader fails in some way, we still keep
|
||||||
* it to avoid trying to compile again and again, and simply do not use
|
* it to avoid trying to compile again and again, and simply do not use
|
||||||
* the actual shader on drawing */
|
* the actual shader on drawing */
|
||||||
|
|||||||
@@ -583,10 +583,9 @@ static void ntree_shader_tag_sss_node(bNodeTree *ntree, bNode *output_node)
|
|||||||
nodeChainIter(ntree, output_node, ntree_tag_sss_bsdf_cb, &sss_id, true);
|
nodeChainIter(ntree, output_node, ntree_tag_sss_bsdf_cb, &sss_id, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat, bool *has_surface_output, bool *has_volume_output)
|
/* This one needs to work on a local tree. */
|
||||||
|
void ntreeGPUMaterialNodes(bNodeTree *localtree, GPUMaterial *mat, bool *has_surface_output, bool *has_volume_output)
|
||||||
{
|
{
|
||||||
/* localize tree to create links for reroute and mute */
|
|
||||||
bNodeTree *localtree = ntreeLocalize(ntree);
|
|
||||||
bNode *output = ntreeShaderOutputNode(localtree, SHD_OUTPUT_EEVEE);
|
bNode *output = ntreeShaderOutputNode(localtree, SHD_OUTPUT_EEVEE);
|
||||||
bNodeTreeExec *exec;
|
bNodeTreeExec *exec;
|
||||||
|
|
||||||
@@ -618,9 +617,6 @@ void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat, bool *has_surface
|
|||||||
*has_volume_output = (nodeCountSocketLinks(localtree, volume_sock) > 0);
|
*has_volume_output = (nodeCountSocketLinks(localtree, volume_sock) > 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ntreeFreeTree(localtree);
|
|
||||||
MEM_freeN(localtree);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bNodeTreeExec *ntreeShaderBeginExecTree_internal(bNodeExecContext *context, bNodeTree *ntree, bNodeInstanceKey parent_key)
|
bNodeTreeExec *ntreeShaderBeginExecTree_internal(bNodeExecContext *context, bNodeTree *ntree, bNodeInstanceKey parent_key)
|
||||||
|
|||||||
Reference in New Issue
Block a user