diff options
Diffstat (limited to 'source/blender/gpu/intern/gpu_codegen.h')
-rw-r--r-- | source/blender/gpu/intern/gpu_codegen.h | 118 |
1 files changed, 57 insertions, 61 deletions
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h index b6db923e5c2..5aa187014ba 100644 --- a/source/blender/gpu/intern/gpu_codegen.h +++ b/source/blender/gpu/intern/gpu_codegen.h @@ -33,34 +33,18 @@ #ifndef __GPU_CODEGEN_H__ #define __GPU_CODEGEN_H__ +#include "DNA_customdata_types.h" #include "DNA_listBase.h" #include "GPU_material.h" -#include "GL/glew.h" +#include "GPU_glew.h" struct ListBase; struct GPUShader; struct GPUOutput; struct GPUNode; struct GPUVertexAttribs; -struct GPUFrameBuffer; struct PreviewImage; -#define MAX_FUNCTION_NAME 64 -#define MAX_PARAMETER 32 - -#define FUNCTION_QUAL_IN 0 -#define FUNCTION_QUAL_OUT 1 -#define FUNCTION_QUAL_INOUT 2 - -typedef struct GPUFunction { - char name[MAX_FUNCTION_NAME]; - int paramtype[MAX_PARAMETER]; - int paramqual[MAX_PARAMETER]; - int totparam; -} GPUFunction; - -GPUFunction *GPU_lookup_function(const char *name); - /* Pass Generation * - Takes a list of nodes and a desired output, and makes a pass. This * will take ownership of the nodes and free them early if unused or @@ -76,11 +60,19 @@ typedef enum GPUDataSource { GPU_SOURCE_ATTRIB } GPUDataSource; +typedef enum { + GPU_NODE_LINK_IMAGE_NONE = 0, + GPU_NODE_LINK_IMAGE_BLENDER = 1, + GPU_NODE_LINK_IMAGE_PREVIEW = 2 +} GPUNodeLinkImage; + struct GPUNode { struct GPUNode *next, *prev; const char *name; - int tag; + + /* Internal flag to mark nodes during pruning */ + bool tag; ListBase inputs; ListBase outputs; @@ -89,24 +81,26 @@ struct GPUNode { struct GPUNodeLink { GPUNodeStack *socket; - int attribtype; + CustomDataType attribtype; const char *attribname; - int image; - int image_isdata; + GPUNodeLinkImage image; + bool image_isdata; - int texture; + bool texture; int texturesize; void *ptr1, *ptr2; - int dynamic; - int dynamictype; + bool dynamic; + GPUDynamicType dynamictype; + + GPUType type; - int type; + /* Refcount */ int users; - GPUTexture *dynamictex; + struct GPUTexture *dynamictex; GPUBuiltin builtin; GPUOpenGLBuiltin oglbuiltin; @@ -118,9 +112,9 @@ typedef struct GPUOutput { struct GPUOutput *next, *prev; GPUNode *node; - int type; /* data type = length of vector/matrix */ - GPUNodeLink *link; /* output link */ - int id; /* unique id as created by code generator */ + GPUType type; /* data type = length of vector/matrix */ + GPUNodeLink *link; /* output link */ + int id; /* unique id as created by code generator */ } GPUOutput; typedef struct GPUInput { @@ -128,35 +122,35 @@ typedef struct GPUInput { GPUNode *node; - int type; /* datatype */ - int source; /* data source */ - - int id; /* unique id as created by code generator */ - int texid; /* number for multitexture */ - int attribid; /* id for vertex attributes */ - int bindtex; /* input is responsible for binding the texture? */ - int definetex; /* input is responsible for defining the pixel? */ - int textarget; /* GL_TEXTURE_* */ - int textype; /* datatype */ - - struct Image *ima; /* image */ - struct ImageUser *iuser;/* image user */ - struct PreviewImage *prv; /* preview images & icons */ - int image_isdata; /* image does not contain color data */ - float *dynamicvec; /* vector data in case it is dynamic */ - int dynamictype; /* origin of the dynamic uniform (GPUDynamicType) */ - void *dynamicdata; /* data source of the dynamic uniform */ - GPUTexture *tex; /* input texture, only set at runtime */ - int shaderloc; /* id from opengl */ - char shadername[32]; /* name in shader */ - - float vec[16]; /* vector data */ + GPUType type; /* datatype */ + GPUDataSource source; /* data source */ + + int id; /* unique id as created by code generator */ + int texid; /* number for multitexture, starting from zero */ + int attribid; /* id for vertex attributes */ + bool bindtex; /* input is responsible for binding the texture? */ + bool definetex; /* input is responsible for defining the pixel? */ + int textarget; /* GL texture target, e.g. GL_TEXTURE_2D */ + GPUType textype; /* datatype */ + + struct Image *ima; /* image */ + struct ImageUser *iuser; /* image user */ + struct PreviewImage *prv; /* preview images & icons */ + bool image_isdata; /* image does not contain color data */ + float *dynamicvec; /* vector data in case it is dynamic */ + GPUDynamicType dynamictype; /* origin of the dynamic uniform */ + void *dynamicdata; /* data source of the dynamic uniform */ + struct GPUTexture *tex; /* input texture, only set at runtime */ + int shaderloc; /* id from opengl */ + char shadername[32]; /* name in shader */ + + float vec[16]; /* vector data */ GPUNodeLink *link; - int dynamictex; /* dynamic? */ - int attribtype; /* attribute type */ - char attribname[32]; /* attribute name */ - int attribfirst; /* this is the first one that is bound */ - GPUBuiltin builtin; /* builtin uniform */ + bool dynamictex; /* dynamic? */ + CustomDataType attribtype; /* attribute type */ + char attribname[MAX_CUSTOMDATA_LAYER_NAME]; /* attribute name */ + int attribfirst; /* this is the first one that is bound */ + GPUBuiltin builtin; /* builtin uniform */ GPUOpenGLBuiltin oglbuiltin; /* opengl built in varying */ } GPUInput; @@ -167,6 +161,7 @@ struct GPUPass { struct GPUOutput *output; struct GPUShader *shader; char *fragmentcode; + char *geometrycode; char *vertexcode; const char *libcode; }; @@ -175,7 +170,8 @@ struct GPUPass { typedef struct GPUPass GPUPass; GPUPass *GPU_generate_pass(ListBase *nodes, struct GPUNodeLink *outlink, - struct GPUVertexAttribs *attribs, int *builtin, const char *name); + struct GPUVertexAttribs *attribs, int *builtin, + const GPUMatType type, const char *name, const bool use_opensubdiv); struct GPUShader *GPU_pass_shader(GPUPass *pass); @@ -185,8 +181,8 @@ void GPU_pass_unbind(GPUPass *pass); void GPU_pass_free(GPUPass *pass); -void GPU_codegen_init(void); -void GPU_codegen_exit(void); +void gpu_codegen_init(void); +void gpu_codegen_exit(void); /* Material calls */ |