From 007f1b74a67302fb4c164eb26969419434a98aee Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 12 Feb 2020 12:48:44 +0100 Subject: Cleanup: split off code from gpu_codegen.c into smaller files --- source/blender/gpu/intern/gpu_node_graph.h | 182 +++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 source/blender/gpu/intern/gpu_node_graph.h (limited to 'source/blender/gpu/intern/gpu_node_graph.h') diff --git a/source/blender/gpu/intern/gpu_node_graph.h b/source/blender/gpu/intern/gpu_node_graph.h new file mode 100644 index 00000000000..51e188e3f5e --- /dev/null +++ b/source/blender/gpu/intern/gpu_node_graph.h @@ -0,0 +1,182 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup gpu + */ + +#ifndef __GPU_NODE_GRAPH_H__ +#define __GPU_NODE_GRAPH_H__ + +#include "DNA_customdata_types.h" +#include "DNA_listBase.h" + +#include "GPU_material.h" +#include "GPU_glew.h" +#include "GPU_shader.h" + +struct GPUNode; +struct GPUOutput; +struct GPUShader; +struct GPUVertAttrLayers; +struct ListBase; + +typedef enum eGPUDataSource { + GPU_SOURCE_OUTPUT, + GPU_SOURCE_CONSTANT, + GPU_SOURCE_UNIFORM, + GPU_SOURCE_ATTR, + GPU_SOURCE_BUILTIN, + GPU_SOURCE_STRUCT, + GPU_SOURCE_TEX, +} eGPUDataSource; + +typedef enum { + GPU_NODE_LINK_NONE = 0, + GPU_NODE_LINK_ATTR, + GPU_NODE_LINK_BUILTIN, + GPU_NODE_LINK_COLORBAND, + GPU_NODE_LINK_CONSTANT, + GPU_NODE_LINK_IMAGE_BLENDER, + GPU_NODE_LINK_IMAGE_TILEMAP, + GPU_NODE_LINK_OUTPUT, + GPU_NODE_LINK_UNIFORM, +} GPUNodeLinkType; + +struct GPUNode { + struct GPUNode *next, *prev; + + const char *name; + + /* Internal flag to mark nodes during pruning */ + bool tag; + + ListBase inputs; + ListBase outputs; +}; + +struct GPUNodeLink { + GPUNodeStack *socket; + + GPUNodeLinkType link_type; + int users; /* Refcount */ + + union { + /* GPU_NODE_LINK_CONSTANT | GPU_NODE_LINK_UNIFORM */ + float *data; + /* GPU_NODE_LINK_BUILTIN */ + eGPUBuiltin builtin; + /* GPU_NODE_LINK_COLORBAND */ + struct GPUTexture **coba; + /* GPU_NODE_LINK_OUTPUT */ + struct GPUOutput *output; + /* GPU_NODE_LINK_ATTR */ + struct { + const char *attr_name; + CustomDataType attr_type; + }; + /* GPU_NODE_LINK_IMAGE_BLENDER | GPU_NODE_LINK_IMAGE_TILEMAP */ + struct { + struct Image *ima; + struct ImageUser *iuser; + }; + }; +}; + +typedef struct GPUOutput { + struct GPUOutput *next, *prev; + + GPUNode *node; + eGPUType type; /* data type = length of vector/matrix */ + GPUNodeLink *link; /* output link */ + int id; /* unique id as created by code generator */ +} GPUOutput; + +typedef struct GPUInput { + struct GPUInput *next, *prev; + + GPUNode *node; + eGPUType type; /* datatype */ + GPUNodeLink *link; + int id; /* unique id as created by code generator */ + + eGPUDataSource source; /* data source */ + + int shaderloc; /* id from opengl */ + char shadername[32]; /* name in shader */ + + /* Content based on eGPUDataSource */ + union { + /* GPU_SOURCE_CONSTANT | GPU_SOURCE_UNIFORM */ + float vec[16]; /* vector data */ + /* GPU_SOURCE_BUILTIN */ + eGPUBuiltin builtin; /* builtin uniform */ + /* GPU_SOURCE_TEX */ + struct { + struct GPUTexture **coba; /* input texture, only set at runtime */ + struct Image *ima; /* image */ + struct ImageUser *iuser; /* image user */ + bool bindtex; /* input is responsible for binding the texture? */ + int texid; /* number for multitexture, starting from zero */ + eGPUType textype; /* texture type (2D, 1D Array ...) */ + }; + /* GPU_SOURCE_ATTR */ + struct { + /** Attribute name. */ + char attr_name[MAX_CUSTOMDATA_LAYER_NAME]; + /** ID for vertex attributes. */ + int attr_id; + /** This is the first one that is bound. */ + bool attr_first; + /** Attribute type. */ + CustomDataType attr_type; + }; + }; +} GPUInput; + +typedef struct GPUNodeGraph { + /* Nodes */ + ListBase nodes; + + /* Inputs and output. */ + ListBase inputs; + GPUNodeLink *outlink; + + /* Needed attributes. */ + GPUVertAttrLayers attrs; + int builtins; +} GPUNodeGraph; + +/* Node Graph */ + +void gpu_node_graph_prune_unused(GPUNodeGraph *graph); +void gpu_node_graph_extract_dynamic_inputs(struct GPUShader *shader, GPUNodeGraph *graph); +void gpu_node_graph_free(GPUNodeGraph *graph); + +/* Material calls */ + +void gpu_material_add_node(struct GPUMaterial *material, struct GPUNode *node); +struct GPUTexture **gpu_material_ramp_texture_row_set(struct GPUMaterial *mat, + int size, + float *pixels, + float *row); + +struct GSet *gpu_material_used_libraries(struct GPUMaterial *material); + +#endif /* __GPU_NODE_GRAPH_H__ */ -- cgit v1.2.3