diff options
Diffstat (limited to 'source/blender/gpu/GPU_shader_interface.h')
-rw-r--r-- | source/blender/gpu/GPU_shader_interface.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/source/blender/gpu/GPU_shader_interface.h b/source/blender/gpu/GPU_shader_interface.h new file mode 100644 index 00000000000..458a49a366b --- /dev/null +++ b/source/blender/gpu/GPU_shader_interface.h @@ -0,0 +1,104 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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) 2016 by Mike Erwin. + * All rights reserved. + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/gpu/GPU_shader_interface.h + * \ingroup gpu + * + * GPU shader interface (C --> GLSL) + */ + +#ifndef __GPU_SHADER_INTERFACE_H__ +#define __GPU_SHADER_INTERFACE_H__ + +#include "GPU_common.h" + +typedef enum { + GPU_UNIFORM_NONE = 0, /* uninitialized/unknown */ + + GPU_UNIFORM_MODEL, /* mat4 ModelMatrix */ + GPU_UNIFORM_VIEW, /* mat4 ViewMatrix */ + GPU_UNIFORM_MODELVIEW, /* mat4 ModelViewMatrix */ + GPU_UNIFORM_PROJECTION, /* mat4 ProjectionMatrix */ + GPU_UNIFORM_VIEWPROJECTION, /* mat4 ViewProjectionMatrix */ + GPU_UNIFORM_MVP, /* mat4 ModelViewProjectionMatrix */ + + GPU_UNIFORM_MODEL_INV, /* mat4 ModelMatrixInverse */ + GPU_UNIFORM_VIEW_INV, /* mat4 ViewMatrixInverse */ + GPU_UNIFORM_MODELVIEW_INV, /* mat4 ModelViewMatrixInverse */ + GPU_UNIFORM_PROJECTION_INV, /* mat4 ProjectionMatrixInverse */ + GPU_UNIFORM_VIEWPROJECTION_INV, /* mat4 ViewProjectionMatrixInverse */ + + GPU_UNIFORM_NORMAL, /* mat3 NormalMatrix */ + GPU_UNIFORM_WORLDNORMAL, /* mat3 WorldNormalMatrix */ + GPU_UNIFORM_CAMERATEXCO, /* vec4 CameraTexCoFactors */ + GPU_UNIFORM_ORCO, /* vec3 OrcoTexCoFactors[] */ + + GPU_UNIFORM_COLOR, /* vec4 color */ + GPU_UNIFORM_EYE, /* vec3 eye */ + GPU_UNIFORM_CALLID, /* int callId */ + + GPU_UNIFORM_CUSTOM, /* custom uniform, not one of the above built-ins */ + + GPU_NUM_UNIFORMS, /* Special value, denotes number of builtin uniforms. */ +} GPUUniformBuiltin; + +typedef struct GPUShaderInput { + struct GPUShaderInput *next; + uint32_t name_offset; + uint name_hash; + GPUUniformBuiltin builtin_type; /* only for uniform inputs */ + uint32_t gl_type; /* only for attrib inputs */ + int32_t size; /* only for attrib inputs */ + int32_t location; +} GPUShaderInput; + +#define GPU_NUM_SHADERINTERFACE_BUCKETS 257 +#define GPU_SHADERINTERFACE_REF_ALLOC_COUNT 16 + +typedef struct GPUShaderInterface { + int32_t program; + uint32_t name_buffer_offset; + GPUShaderInput *attrib_buckets[GPU_NUM_SHADERINTERFACE_BUCKETS]; + GPUShaderInput *uniform_buckets[GPU_NUM_SHADERINTERFACE_BUCKETS]; + GPUShaderInput *ubo_buckets[GPU_NUM_SHADERINTERFACE_BUCKETS]; + GPUShaderInput *builtin_uniforms[GPU_NUM_UNIFORMS]; + char *name_buffer; + struct GPUBatch **batches; /* references to batches using this interface */ + uint batches_len; +} GPUShaderInterface; + +GPUShaderInterface *GPU_shaderinterface_create(int32_t program_id); +void GPU_shaderinterface_discard(GPUShaderInterface *); + +const GPUShaderInput *GPU_shaderinterface_uniform(const GPUShaderInterface *, const char *name); +const GPUShaderInput *GPU_shaderinterface_uniform_builtin(const GPUShaderInterface *, GPUUniformBuiltin); +const GPUShaderInput *GPU_shaderinterface_ubo(const GPUShaderInterface *, const char *name); +const GPUShaderInput *GPU_shaderinterface_attr(const GPUShaderInterface *, const char *name); + +/* keep track of batches using this interface */ +void GPU_shaderinterface_add_batch_ref(GPUShaderInterface *, struct GPUBatch *); +void GPU_shaderinterface_remove_batch_ref(GPUShaderInterface *, struct GPUBatch *); + +#endif /* __GPU_SHADER_INTERFACE_H__ */ |