2015-12-06 21:20:19 +01:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2019-02-06 15:42:22 +11:00
|
|
|
/** \file \ingroup gpu
|
2015-12-06 21:20:19 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __GPU_SHADER_H__
|
|
|
|
#define __GPU_SHADER_H__
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef struct GPUShader GPUShader;
|
2015-12-23 20:39:03 +01:00
|
|
|
struct GPUTexture;
|
2017-02-07 11:20:15 +01:00
|
|
|
struct GPUUniformBuffer;
|
2015-12-06 21:20:19 +01:00
|
|
|
|
|
|
|
/* GPU Shader
|
|
|
|
* - only for fragment shaders now
|
|
|
|
* - must call texture bind before setting a texture as uniform! */
|
|
|
|
|
2019-01-23 14:15:43 +11:00
|
|
|
typedef enum eGPUShaderTFBType {
|
2018-05-16 12:47:15 +02:00
|
|
|
GPU_SHADER_TFB_NONE = 0, /* Transform feedback unsupported. */
|
|
|
|
GPU_SHADER_TFB_POINTS = 1,
|
|
|
|
GPU_SHADER_TFB_LINES = 2,
|
|
|
|
GPU_SHADER_TFB_TRIANGLES = 3,
|
2019-01-23 14:15:43 +11:00
|
|
|
} eGPUShaderTFBType;
|
2018-05-16 12:47:15 +02:00
|
|
|
|
2016-01-10 07:12:10 +11:00
|
|
|
GPUShader *GPU_shader_create(
|
|
|
|
const char *vertexcode,
|
|
|
|
const char *fragcode,
|
|
|
|
const char *geocode,
|
|
|
|
const char *libcode,
|
2018-08-02 18:31:38 +02:00
|
|
|
const char *defines,
|
|
|
|
const char *shader_name);
|
2016-01-10 07:12:10 +11:00
|
|
|
GPUShader *GPU_shader_create_ex(
|
|
|
|
const char *vertexcode,
|
|
|
|
const char *fragcode,
|
|
|
|
const char *geocode,
|
|
|
|
const char *libcode,
|
|
|
|
const char *defines,
|
2019-01-23 14:15:43 +11:00
|
|
|
const eGPUShaderTFBType tf_type,
|
2018-05-16 12:47:15 +02:00
|
|
|
const char **tf_names,
|
2018-08-02 18:31:38 +02:00
|
|
|
const int tf_count,
|
|
|
|
const char *shader_name);
|
2019-02-06 09:15:16 +11:00
|
|
|
struct GPU_ShaderCreateFromArray_Params { const char **vert, **geom, **frag, **defs; };
|
|
|
|
struct GPUShader *GPU_shader_create_from_arrays_impl(
|
|
|
|
const struct GPU_ShaderCreateFromArray_Params *params);
|
|
|
|
#define GPU_shader_create_from_arrays(...) \
|
|
|
|
GPU_shader_create_from_arrays_impl(&(const struct GPU_ShaderCreateFromArray_Params)__VA_ARGS__)
|
|
|
|
|
2015-12-06 21:20:19 +01:00
|
|
|
void GPU_shader_free(GPUShader *shader);
|
|
|
|
|
|
|
|
void GPU_shader_bind(GPUShader *shader);
|
|
|
|
void GPU_shader_unbind(void);
|
|
|
|
|
2018-09-24 18:46:51 +02:00
|
|
|
/* Returns true if transform feedback was successfully enabled. */
|
2018-05-16 12:47:15 +02:00
|
|
|
bool GPU_shader_transform_feedback_enable(GPUShader *shader, unsigned int vbo_id);
|
|
|
|
void GPU_shader_transform_feedback_disable(GPUShader *shader);
|
|
|
|
|
2017-02-07 11:20:15 +01:00
|
|
|
int GPU_shader_get_program(GPUShader *shader);
|
2017-03-02 21:46:54 -05:00
|
|
|
|
2016-03-21 00:53:48 +01:00
|
|
|
void *GPU_shader_get_interface(GPUShader *shader);
|
2017-03-02 21:46:54 -05:00
|
|
|
|
2015-12-06 21:20:19 +01:00
|
|
|
int GPU_shader_get_uniform(GPUShader *shader, const char *name);
|
2019-01-16 04:41:27 +01:00
|
|
|
int GPU_shader_get_uniform_ensure(GPUShader *shader, const char *name);
|
2017-10-08 15:49:25 +02:00
|
|
|
int GPU_shader_get_builtin_uniform(GPUShader *shader, int builtin);
|
2017-02-07 11:20:15 +01:00
|
|
|
int GPU_shader_get_uniform_block(GPUShader *shader, const char *name);
|
2018-07-18 23:09:31 +10:00
|
|
|
void GPU_shader_uniform_vector(
|
|
|
|
GPUShader *shader, int location, int length,
|
|
|
|
int arraysize, const float *value);
|
|
|
|
void GPU_shader_uniform_vector_int(
|
|
|
|
GPUShader *shader, int location, int length,
|
|
|
|
int arraysize, const int *value);
|
2015-12-06 21:20:19 +01:00
|
|
|
|
2017-02-07 11:20:15 +01:00
|
|
|
void GPU_shader_uniform_buffer(GPUShader *shader, int location, struct GPUUniformBuffer *ubo);
|
2015-12-23 20:39:03 +01:00
|
|
|
void GPU_shader_uniform_texture(GPUShader *shader, int location, struct GPUTexture *tex);
|
2018-09-20 19:51:02 +00:00
|
|
|
void GPU_shader_uniform_float(GPUShader *shader, int location, float value);
|
2015-12-06 21:20:19 +01:00
|
|
|
void GPU_shader_uniform_int(GPUShader *shader, int location, int value);
|
|
|
|
|
|
|
|
int GPU_shader_get_attribute(GPUShader *shader, const char *name);
|
|
|
|
|
|
|
|
/* Builtin/Non-generated shaders */
|
2019-01-23 14:15:43 +11:00
|
|
|
typedef enum eGPUBuiltinShader {
|
2016-10-25 03:19:10 -04:00
|
|
|
/* specialized drawing */
|
2016-09-17 13:33:02 +02:00
|
|
|
GPU_SHADER_TEXT,
|
2018-03-30 22:50:17 +02:00
|
|
|
GPU_SHADER_TEXT_SIMPLE,
|
2016-10-25 03:19:10 -04:00
|
|
|
GPU_SHADER_EDGES_FRONT_BACK_PERSP,
|
|
|
|
GPU_SHADER_EDGES_FRONT_BACK_ORTHO,
|
2016-11-05 19:26:13 +01:00
|
|
|
GPU_SHADER_EDGES_OVERLAY_SIMPLE,
|
|
|
|
GPU_SHADER_EDGES_OVERLAY,
|
2017-02-11 00:02:28 -05:00
|
|
|
GPU_SHADER_KEYFRAME_DIAMOND,
|
2017-02-07 13:04:08 +01:00
|
|
|
GPU_SHADER_SIMPLE_LIGHTING,
|
2017-05-10 20:14:52 +10:00
|
|
|
GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR,
|
2017-03-11 16:10:03 +01:00
|
|
|
GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR,
|
2017-05-03 18:55:40 +02:00
|
|
|
GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR_ALPHA,
|
2018-05-23 15:26:59 +02:00
|
|
|
|
2016-08-16 14:58:53 -04:00
|
|
|
/* for simple 2D drawing */
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Take a single color for all the vertices and a 2D position for each vertex.
|
|
|
|
*
|
|
|
|
* \param color: uniform vec4
|
|
|
|
* \param pos: in vec2
|
|
|
|
*/
|
2016-08-04 15:59:38 -04:00
|
|
|
GPU_SHADER_2D_UNIFORM_COLOR,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Take a 2D position and color for each vertex without color interpolation.
|
|
|
|
*
|
|
|
|
* \param color: in vec4
|
|
|
|
* \param pos: in vec2
|
|
|
|
*/
|
2016-08-08 04:56:02 -04:00
|
|
|
GPU_SHADER_2D_FLAT_COLOR,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Take a 2D position and color for each vertex with linear interpolation in window space.
|
|
|
|
*
|
|
|
|
* \param color: in vec4
|
|
|
|
* \param pos: in vec2
|
|
|
|
*/
|
2016-08-04 15:59:38 -04:00
|
|
|
GPU_SHADER_2D_SMOOTH_COLOR,
|
2018-04-21 16:45:47 +02:00
|
|
|
GPU_SHADER_2D_SMOOTH_COLOR_DITHER,
|
2018-02-13 18:09:58 +01:00
|
|
|
GPU_SHADER_2D_IMAGE,
|
2016-11-18 16:04:25 +01:00
|
|
|
GPU_SHADER_2D_IMAGE_COLOR,
|
2018-04-26 15:42:08 +02:00
|
|
|
GPU_SHADER_2D_IMAGE_DESATURATE_COLOR,
|
2017-04-19 16:52:47 +02:00
|
|
|
GPU_SHADER_2D_IMAGE_ALPHA_COLOR,
|
2018-02-13 18:09:58 +01:00
|
|
|
GPU_SHADER_2D_IMAGE_ALPHA,
|
2018-03-27 23:57:29 +02:00
|
|
|
GPU_SHADER_2D_IMAGE_RECT_COLOR,
|
2018-03-31 19:32:28 +02:00
|
|
|
GPU_SHADER_2D_IMAGE_MULTI_RECT_COLOR,
|
2018-04-23 21:08:11 +02:00
|
|
|
GPU_SHADER_2D_IMAGE_MULTISAMPLE_2,
|
|
|
|
GPU_SHADER_2D_IMAGE_MULTISAMPLE_4,
|
|
|
|
GPU_SHADER_2D_IMAGE_MULTISAMPLE_8,
|
|
|
|
GPU_SHADER_2D_IMAGE_MULTISAMPLE_16,
|
2018-07-30 13:56:22 +02:00
|
|
|
GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST,
|
|
|
|
GPU_SHADER_2D_IMAGE_MULTISAMPLE_4_DEPTH_TEST,
|
|
|
|
GPU_SHADER_2D_IMAGE_MULTISAMPLE_8_DEPTH_TEST,
|
|
|
|
GPU_SHADER_2D_IMAGE_MULTISAMPLE_16_DEPTH_TEST,
|
2017-02-07 13:04:08 +01:00
|
|
|
GPU_SHADER_2D_CHECKER,
|
2017-02-16 21:49:20 -02:00
|
|
|
GPU_SHADER_2D_DIAG_STRIPES,
|
2016-08-16 14:58:53 -04:00
|
|
|
/* for simple 3D drawing */
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Take a single color for all the vertices and a 3D position for each vertex.
|
|
|
|
*
|
|
|
|
* \param color: uniform vec4
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2016-08-16 14:58:53 -04:00
|
|
|
GPU_SHADER_3D_UNIFORM_COLOR,
|
2019-01-23 23:30:30 +11:00
|
|
|
/* Sets Z-depth to 1.0 (draw onto background). */
|
|
|
|
GPU_SHADER_3D_UNIFORM_COLOR_BACKGROUND,
|
2017-02-07 11:20:15 +01:00
|
|
|
GPU_SHADER_3D_UNIFORM_COLOR_INSTANCE,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Take a 3D position and color for each vertex without color interpolation.
|
|
|
|
*
|
|
|
|
* \param color: in vec4
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2016-08-16 14:58:53 -04:00
|
|
|
GPU_SHADER_3D_FLAT_COLOR,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Take a 3D position and color for each vertex with perspective correct interpolation.
|
|
|
|
*
|
|
|
|
* \param color: in vec4
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2016-08-16 14:58:53 -04:00
|
|
|
GPU_SHADER_3D_SMOOTH_COLOR,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Take a 3D position for each vertex and output only depth.
|
|
|
|
*
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2016-09-13 02:51:38 -04:00
|
|
|
GPU_SHADER_3D_DEPTH_ONLY,
|
2017-04-05 01:28:48 +02:00
|
|
|
GPU_SHADER_3D_CLIPPED_UNIFORM_COLOR,
|
2016-10-18 00:08:34 -04:00
|
|
|
/* basic image drawing */
|
2017-05-11 16:20:10 +02:00
|
|
|
GPU_SHADER_2D_IMAGE_LINEAR_TO_SRGB,
|
2017-02-24 01:07:40 +01:00
|
|
|
GPU_SHADER_2D_IMAGE_SHUFFLE_COLOR,
|
2016-11-08 10:51:42 -05:00
|
|
|
GPU_SHADER_2D_IMAGE_MASK_UNIFORM_COLOR,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
2018-09-24 18:46:51 +02:00
|
|
|
* Draw texture with alpha. Take a 3D position and a 2D texture coordinate for each vertex.
|
2018-05-23 15:26:59 +02:00
|
|
|
*
|
|
|
|
* \param alpha: uniform float
|
|
|
|
* \param image: uniform sampler2D
|
|
|
|
* \param texCoord: in vec2
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2016-10-18 00:08:34 -04:00
|
|
|
GPU_SHADER_3D_IMAGE_MODULATE_ALPHA,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw linearized depth texture relate to near and far distances.
|
2018-09-24 18:46:51 +02:00
|
|
|
* Take a 3D position and a 2D texture coordinate for each vertex.
|
2018-05-23 15:26:59 +02:00
|
|
|
*
|
|
|
|
* \param znear: uniform float
|
|
|
|
* \param zfar: uniform float
|
|
|
|
* \param image: uniform sampler2D
|
|
|
|
* \param texCoord: in vec2
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2016-10-21 20:48:08 +00:00
|
|
|
GPU_SHADER_3D_IMAGE_DEPTH,
|
2018-02-26 19:41:17 +01:00
|
|
|
GPU_SHADER_3D_IMAGE_DEPTH_COPY,
|
2017-01-09 17:58:13 +01:00
|
|
|
/* stereo 3d */
|
|
|
|
GPU_SHADER_2D_IMAGE_INTERLACE,
|
2016-09-30 20:44:22 -04:00
|
|
|
/* points */
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a hardcoded size.
|
|
|
|
* Take a single color for all the vertices and a 2D position for each vertex.
|
|
|
|
*
|
|
|
|
* \param color: uniform vec4
|
|
|
|
* \param pos: in vec2
|
|
|
|
*/
|
2016-10-06 14:20:20 -04:00
|
|
|
GPU_SHADER_2D_POINT_FIXED_SIZE_UNIFORM_COLOR,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a constant size.
|
|
|
|
* Take a single color for all the vertices and a 2D position for each vertex.
|
|
|
|
*
|
|
|
|
* \param size: uniform float
|
|
|
|
* \param color: uniform vec4
|
|
|
|
* \param pos: in vec2
|
|
|
|
*/
|
2017-02-28 02:18:52 -05:00
|
|
|
GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a constant size and an outline.
|
|
|
|
* Take a single color for all the vertices and a 2D position for each vertex.
|
|
|
|
*
|
|
|
|
* \param size: uniform float
|
|
|
|
* \param outlineWidth: uniform float
|
|
|
|
* \param color: uniform vec4
|
|
|
|
* \param outlineColor: uniform vec4
|
|
|
|
* \param pos: in vec2
|
|
|
|
*/
|
2017-02-28 02:18:52 -05:00
|
|
|
GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a constant size and an outline. Take a 2D position and a color for each vertex.
|
|
|
|
*
|
|
|
|
* \param size: uniform float
|
|
|
|
* \param outlineWidth: uniform float
|
|
|
|
* \param outlineColor: uniform vec4
|
|
|
|
* \param color: in vec4
|
|
|
|
* \param pos: in vec2
|
|
|
|
*/
|
2017-02-28 02:18:52 -05:00
|
|
|
GPU_SHADER_2D_POINT_UNIFORM_SIZE_VARYING_COLOR_OUTLINE_AA,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a constant size and an outline. Take a 2D position and a color for each vertex.
|
|
|
|
*
|
|
|
|
* \param size: in float
|
|
|
|
* \param color: in vec4
|
|
|
|
* \param pos: in vec2
|
|
|
|
*/
|
2016-10-06 16:31:49 -04:00
|
|
|
GPU_SHADER_2D_POINT_VARYING_SIZE_VARYING_COLOR,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a hardcoded size.
|
|
|
|
* Take a single color for all the vertices and a 3D position for each vertex.
|
|
|
|
*
|
|
|
|
* \param color: uniform vec4
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2016-10-06 14:20:20 -04:00
|
|
|
GPU_SHADER_3D_POINT_FIXED_SIZE_UNIFORM_COLOR,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a hardcoded size.
|
|
|
|
* Take a single color for all the vertices and a 3D position for each vertex.
|
|
|
|
*
|
|
|
|
* \param color: uniform vec4
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2016-09-30 20:44:22 -04:00
|
|
|
GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a constant size.
|
|
|
|
* Take a single color for all the vertices and a 3D position for each vertex.
|
|
|
|
*
|
|
|
|
* \param size: uniform float
|
|
|
|
* \param color: uniform vec4
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2017-02-28 02:18:52 -05:00
|
|
|
GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a constant size and an outline.
|
|
|
|
* Take a single color for all the vertices and a 3D position for each vertex.
|
|
|
|
*
|
|
|
|
* \param size: uniform float
|
|
|
|
* \param outlineWidth: uniform float
|
|
|
|
* \param color: uniform vec4
|
|
|
|
* \param outlineColor: uniform vec4
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2017-02-28 02:18:52 -05:00
|
|
|
GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a constant size and an outline.
|
|
|
|
* Take a single color for all the vertices and a 3D position for each vertex.
|
|
|
|
*
|
|
|
|
* \param color: uniform vec4
|
|
|
|
* \param size: in float
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2016-09-30 20:44:22 -04:00
|
|
|
GPU_SHADER_3D_POINT_VARYING_SIZE_UNIFORM_COLOR,
|
2018-05-23 15:26:59 +02:00
|
|
|
/**
|
|
|
|
* Draw round points with a constant size and an outline. Take a 3D position and a color for each vertex.
|
|
|
|
*
|
|
|
|
* \param size: in float
|
|
|
|
* \param color: in vec4
|
|
|
|
* \param pos: in vec3
|
|
|
|
*/
|
2016-10-01 17:32:29 -04:00
|
|
|
GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR,
|
2017-02-24 15:33:09 -05:00
|
|
|
/* lines */
|
2017-07-13 16:44:02 +02:00
|
|
|
GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR,
|
|
|
|
GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR,
|
2017-02-07 11:20:15 +01:00
|
|
|
/* lamp drawing */
|
|
|
|
GPU_SHADER_3D_GROUNDPOINT,
|
|
|
|
GPU_SHADER_3D_GROUNDLINE,
|
2017-02-11 21:15:46 +01:00
|
|
|
GPU_SHADER_3D_SCREENSPACE_VARIYING_COLOR,
|
2017-02-22 12:46:27 +01:00
|
|
|
/* bone drawing */
|
|
|
|
GPU_SHADER_3D_OBJECTSPACE_VARIYING_COLOR,
|
|
|
|
GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR,
|
2017-03-04 00:09:22 +01:00
|
|
|
/* camera drawing */
|
|
|
|
GPU_SHADER_CAMERA,
|
|
|
|
/* distance in front of objects */
|
|
|
|
GPU_SHADER_DISTANCE_LINES,
|
2017-02-15 02:54:52 +01:00
|
|
|
/* axis name */
|
2017-02-22 12:50:03 +01:00
|
|
|
GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED_AXIS,
|
2017-04-10 22:22:37 +02:00
|
|
|
GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED,
|
2017-02-09 20:55:31 +01:00
|
|
|
/* instance */
|
|
|
|
GPU_SHADER_INSTANCE_UNIFORM_COLOR,
|
2018-04-17 13:00:09 +02:00
|
|
|
GPU_SHADER_INSTANCE_VARIYING_ID_VARIYING_SIZE, /* Uniformly scaled */
|
2017-04-10 22:22:37 +02:00
|
|
|
GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE, /* Uniformly scaled */
|
|
|
|
GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SCALE,
|
2017-03-05 05:22:40 +01:00
|
|
|
GPU_SHADER_INSTANCE_EDGES_VARIYING_COLOR,
|
2018-07-31 10:22:19 +02:00
|
|
|
/* grease pencil drawing */
|
|
|
|
GPU_SHADER_GPENCIL_STROKE,
|
|
|
|
GPU_SHADER_GPENCIL_FILL,
|
|
|
|
/* specialized for widget drawing */
|
2018-08-23 22:29:29 +02:00
|
|
|
GPU_SHADER_2D_AREA_EDGES,
|
2018-03-29 03:06:33 +02:00
|
|
|
GPU_SHADER_2D_WIDGET_BASE,
|
2018-04-06 14:22:20 +02:00
|
|
|
GPU_SHADER_2D_WIDGET_BASE_INST,
|
2018-04-06 10:09:23 +02:00
|
|
|
GPU_SHADER_2D_WIDGET_SHADOW,
|
2018-04-05 15:27:53 +02:00
|
|
|
GPU_SHADER_2D_NODELINK,
|
|
|
|
GPU_SHADER_2D_NODELINK_INST,
|
2018-09-29 19:42:09 +02:00
|
|
|
/* specialized for edituv drawing */
|
2019-01-10 22:22:42 +01:00
|
|
|
GPU_SHADER_2D_UV_UNIFORM_COLOR,
|
2018-09-29 19:42:09 +02:00
|
|
|
GPU_SHADER_2D_UV_VERTS,
|
|
|
|
GPU_SHADER_2D_UV_FACEDOTS,
|
|
|
|
GPU_SHADER_2D_UV_EDGES,
|
|
|
|
GPU_SHADER_2D_UV_EDGES_SMOOTH,
|
|
|
|
GPU_SHADER_2D_UV_FACES,
|
2019-01-10 17:59:11 +01:00
|
|
|
GPU_SHADER_2D_UV_FACES_STRETCH_AREA,
|
|
|
|
GPU_SHADER_2D_UV_FACES_STRETCH_ANGLE,
|
2018-12-22 21:02:30 +01:00
|
|
|
/* Selection */
|
|
|
|
GPU_SHADER_3D_FLAT_SELECT_ID,
|
|
|
|
GPU_SHADER_3D_UNIFORM_SELECT_ID,
|
2019-01-23 14:15:43 +11:00
|
|
|
} eGPUBuiltinShader;
|
2019-02-06 09:15:16 +11:00
|
|
|
#define GPU_SHADER_BUILTIN_LEN (GPU_SHADER_3D_UNIFORM_SELECT_ID + 1)
|
|
|
|
|
|
|
|
/** Support multiple configurations. */
|
|
|
|
typedef enum eGPUShaderConfig {
|
|
|
|
GPU_SHADER_CFG_DEFAULT = 0,
|
|
|
|
GPU_SHADER_CFG_CLIPPED = 1,
|
|
|
|
} eGPUShaderConfig;
|
|
|
|
#define GPU_SHADER_CFG_LEN (GPU_SHADER_CFG_CLIPPED + 1)
|
2015-12-06 21:20:19 +01:00
|
|
|
|
2018-09-02 18:28:27 +10:00
|
|
|
/** Keep these in sync with:
|
|
|
|
* - `gpu_shader_image_interlace_frag.glsl`
|
|
|
|
* - `gpu_shader_image_rect_interlace_frag.glsl`
|
|
|
|
*/
|
2019-01-23 14:15:43 +11:00
|
|
|
typedef enum eGPUInterlaceShader {
|
2017-01-09 17:58:13 +01:00
|
|
|
GPU_SHADER_INTERLACE_ROW = 0,
|
|
|
|
GPU_SHADER_INTERLACE_COLUMN = 1,
|
|
|
|
GPU_SHADER_INTERLACE_CHECKER = 2,
|
2019-01-23 14:15:43 +11:00
|
|
|
} eGPUInterlaceShader;
|
2017-01-09 17:58:13 +01:00
|
|
|
|
2019-02-06 09:15:16 +11:00
|
|
|
GPUShader *GPU_shader_get_builtin_shader_with_config(
|
|
|
|
eGPUBuiltinShader shader, eGPUShaderConfig shader_cfg);
|
|
|
|
GPUShader *GPU_shader_get_builtin_shader(
|
|
|
|
eGPUBuiltinShader shader);
|
2015-12-06 21:20:19 +01:00
|
|
|
|
2018-09-14 09:32:19 -03:00
|
|
|
void GPU_shader_get_builtin_shader_code(
|
2019-01-23 14:15:43 +11:00
|
|
|
eGPUBuiltinShader shader,
|
2018-09-15 08:00:29 +10:00
|
|
|
const char **r_vert, const char **r_frag,
|
|
|
|
const char **r_geom, const char **r_defines);
|
2018-09-14 09:32:19 -03:00
|
|
|
|
2015-12-06 21:20:19 +01:00
|
|
|
void GPU_shader_free_builtin_shaders(void);
|
|
|
|
|
|
|
|
/* Vertex attributes for shaders */
|
|
|
|
|
2019-01-29 07:46:25 +11:00
|
|
|
#define GPU_MAX_ATTR 32
|
2015-12-06 21:20:19 +01:00
|
|
|
|
2019-01-29 07:46:25 +11:00
|
|
|
typedef struct GPUVertAttrLayers {
|
2015-12-06 21:20:19 +01:00
|
|
|
struct {
|
|
|
|
int type;
|
|
|
|
int glindex;
|
2016-05-31 14:39:49 +02:00
|
|
|
int glinfoindoex;
|
2015-12-06 21:20:19 +01:00
|
|
|
int gltexco;
|
2019-01-29 07:46:25 +11:00
|
|
|
int attr_id;
|
2018-07-18 23:09:31 +10:00
|
|
|
char name[64]; /* MAX_CUSTOMDATA_LAYER_NAME */
|
2019-01-29 07:46:25 +11:00
|
|
|
} layer[GPU_MAX_ATTR];
|
2015-12-06 21:20:19 +01:00
|
|
|
|
|
|
|
int totlayer;
|
2019-01-29 07:46:25 +11:00
|
|
|
} GPUVertAttrLayers;
|
2015-12-06 21:20:19 +01:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* __GPU_SHADER_H__ */
|