GPU: refactor defines into GPUShaderStages

Code comment notes there are "just a few",
now there are enough it's useful to include in GPUShaderStages.
This commit is contained in:
Campbell Barton 2019-01-26 10:04:10 +11:00
parent 0e95abf74b
commit 1393335227
1 changed files with 51 additions and 74 deletions

View File

@ -190,6 +190,8 @@ typedef struct {
/** Optional. */
const char *geom;
const char *frag;
/** Optional. */
const char *defs;
} GPUShaderStages;
static void shader_print_errors(const char *task, const char *log, const char **code, int totcode)
@ -719,6 +721,8 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR] = {
.vert = datatoc_gpu_shader_3D_normal_smooth_color_vert_glsl,
.frag = datatoc_gpu_shader_simple_lighting_smooth_color_frag_glsl,
.defs =
"#define USE_FLAT_NORMAL\n",
},
[GPU_SHADER_SIMPLE_LIGHTING_SMOOTH_COLOR] = {
.vert = datatoc_gpu_shader_3D_normal_smooth_color_vert_glsl,
@ -748,34 +752,54 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_2D_IMAGE_MULTISAMPLE_2] = {
.vert = datatoc_gpu_shader_2D_vert_glsl,
.frag = datatoc_gpu_shader_image_multisample_resolve_frag_glsl,
.defs =
"#define SAMPLES 2\n",
},
[GPU_SHADER_2D_IMAGE_MULTISAMPLE_4] = {
.vert = datatoc_gpu_shader_2D_vert_glsl,
.frag = datatoc_gpu_shader_image_multisample_resolve_frag_glsl,
.defs =
"#define SAMPLES 4\n",
},
[GPU_SHADER_2D_IMAGE_MULTISAMPLE_8] = {
.vert = datatoc_gpu_shader_2D_vert_glsl,
.frag = datatoc_gpu_shader_image_multisample_resolve_frag_glsl,
.defs =
"#define SAMPLES 8\n",
},
[GPU_SHADER_2D_IMAGE_MULTISAMPLE_16] = {
.vert = datatoc_gpu_shader_2D_vert_glsl,
.frag = datatoc_gpu_shader_image_multisample_resolve_frag_glsl,
.defs =
"#define SAMPLES 16\n",
},
[GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST] = {
.vert = datatoc_gpu_shader_2D_vert_glsl,
.frag = datatoc_gpu_shader_image_multisample_resolve_frag_glsl,
.defs =
"#define SAMPLES 2\n"
"#define USE_DEPTH\n",
},
[GPU_SHADER_2D_IMAGE_MULTISAMPLE_4_DEPTH_TEST] = {
.vert = datatoc_gpu_shader_2D_vert_glsl,
.frag = datatoc_gpu_shader_image_multisample_resolve_frag_glsl,
.defs =
"#define SAMPLES 4\n"
"#define USE_DEPTH\n",
},
[GPU_SHADER_2D_IMAGE_MULTISAMPLE_8_DEPTH_TEST] = {
.vert = datatoc_gpu_shader_2D_vert_glsl,
.frag = datatoc_gpu_shader_image_multisample_resolve_frag_glsl,
.defs =
"#define SAMPLES 8\n"
"#define USE_DEPTH\n",
},
[GPU_SHADER_2D_IMAGE_MULTISAMPLE_16_DEPTH_TEST] = {
.vert = datatoc_gpu_shader_2D_vert_glsl,
.frag = datatoc_gpu_shader_image_multisample_resolve_frag_glsl,
.defs =
"#define SAMPLES 16\n"
"#define USE_DEPTH\n",
},
[GPU_SHADER_2D_IMAGE_INTERLACE] = {
@ -848,6 +872,8 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_3D_UNIFORM_COLOR_BACKGROUND] = {
.vert = datatoc_gpu_shader_3D_vert_glsl,
.frag = datatoc_gpu_shader_uniform_color_frag_glsl,
.defs =
"#define USE_BACKGROUND\n",
},
[GPU_SHADER_3D_FLAT_COLOR] = {
.vert = datatoc_gpu_shader_3D_flat_color_vert_glsl,
@ -890,6 +916,8 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR] = {
.vert = datatoc_gpu_shader_instance_objectspace_variying_color_vert_glsl,
.frag = datatoc_gpu_shader_simple_lighting_frag_glsl,
.defs =
"#define USE_INSTANCE_COLOR\n",
},
[GPU_SHADER_3D_OBJECTSPACE_VARIYING_COLOR] = {
.vert = datatoc_gpu_shader_instance_objectspace_variying_color_vert_glsl,
@ -902,6 +930,8 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED_AXIS] = {
.vert = datatoc_gpu_shader_instance_screen_aligned_vert_glsl,
.frag = datatoc_gpu_shader_flat_color_frag_glsl,
.defs =
"#define AXIS_NAME\n",
},
[GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED] = {
.vert = datatoc_gpu_shader_instance_screen_aligned_vert_glsl,
@ -969,10 +999,14 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_INSTANCE_VARIYING_ID_VARIYING_SIZE] = {
.vert = datatoc_gpu_shader_instance_variying_size_variying_id_vert_glsl,
.frag = datatoc_gpu_shader_flat_id_frag_glsl,
.defs =
"#define UNIFORM_SCALE\n",
},
[GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE] = {
.vert = datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl,
.frag = datatoc_gpu_shader_flat_color_frag_glsl,
.defs =
"#define UNIFORM_SCALE\n",
},
[GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SCALE] = {
.vert = datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl,
@ -995,6 +1029,8 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_2D_WIDGET_BASE_INST] = {
.vert = datatoc_gpu_shader_2D_widget_base_vert_glsl,
.frag = datatoc_gpu_shader_2D_widget_base_frag_glsl,
.defs =
"#define USE_INSTANCE\n",
},
[GPU_SHADER_2D_WIDGET_SHADOW] = {
.vert = datatoc_gpu_shader_2D_widget_shadow_vert_glsl,
@ -1007,11 +1043,15 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_2D_NODELINK_INST] = {
.vert = datatoc_gpu_shader_2D_nodelink_vert_glsl,
.frag = datatoc_gpu_shader_2D_nodelink_frag_glsl,
.defs =
"#define USE_INSTANCE\n",
},
[GPU_SHADER_2D_UV_UNIFORM_COLOR] = {
.vert = datatoc_gpu_shader_2D_vert_glsl,
.frag = datatoc_gpu_shader_uniform_color_frag_glsl,
.defs =
"#define UV_POS\n",
},
[GPU_SHADER_2D_UV_VERTS] = {
.vert = datatoc_gpu_shader_2D_edituvs_points_vert_glsl,
@ -1028,6 +1068,8 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_2D_UV_EDGES_SMOOTH] = {
.vert = datatoc_gpu_shader_2D_edituvs_edges_vert_glsl,
.frag = datatoc_gpu_shader_2D_smooth_color_frag_glsl,
.defs =
"#define SMOOTH_COLOR\n",
},
[GPU_SHADER_2D_UV_FACES] = {
.vert = datatoc_gpu_shader_2D_edituvs_faces_vert_glsl,
@ -1040,6 +1082,8 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_2D_UV_FACES_STRETCH_ANGLE] = {
.vert = datatoc_gpu_shader_2D_edituvs_stretch_vert_glsl,
.frag = datatoc_gpu_shader_2D_smooth_color_frag_glsl,
.defs =
"#define STRETCH_ANGLE\n",
},
[GPU_SHADER_3D_FLAT_SELECT_ID] = {
@ -1049,6 +1093,8 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
[GPU_SHADER_3D_UNIFORM_SELECT_ID] = {
.vert = datatoc_gpu_shader_3D_selection_id_vert_glsl,
.frag = datatoc_gpu_shader_selection_id_frag_glsl,
.defs =
"#define UNIFORM_ID\n",
},
[GPU_SHADER_GPENCIL_STROKE] = {
@ -1063,82 +1109,12 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
},
};
/* just a few special cases */
static const char *gpu_shader_get_builtin_shader_defines(
eGPUBuiltinShader shader)
{
switch (shader) {
case GPU_SHADER_2D_IMAGE_MULTISAMPLE_2:
return "#define SAMPLES 2\n";
case GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST:
return "#define SAMPLES 2\n"
"#define USE_DEPTH\n";
case GPU_SHADER_2D_IMAGE_MULTISAMPLE_4:
return "#define SAMPLES 4\n";
case GPU_SHADER_2D_IMAGE_MULTISAMPLE_4_DEPTH_TEST:
return "#define SAMPLES 4\n"
"#define USE_DEPTH\n";
case GPU_SHADER_2D_IMAGE_MULTISAMPLE_8:
return "#define SAMPLES 8\n";
case GPU_SHADER_2D_IMAGE_MULTISAMPLE_8_DEPTH_TEST:
return "#define SAMPLES 8\n"
"#define USE_DEPTH\n";
case GPU_SHADER_2D_IMAGE_MULTISAMPLE_16:
return "#define SAMPLES 16\n";
case GPU_SHADER_2D_IMAGE_MULTISAMPLE_16_DEPTH_TEST:
return "#define SAMPLES 16\n"
"#define USE_DEPTH\n";
case GPU_SHADER_2D_WIDGET_BASE_INST:
case GPU_SHADER_2D_NODELINK_INST:
return "#define USE_INSTANCE\n";
case GPU_SHADER_INSTANCE_VARIYING_ID_VARIYING_SIZE:
case GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE:
return "#define UNIFORM_SCALE\n";
case GPU_SHADER_3D_INSTANCE_SCREEN_ALIGNED_AXIS:
return "#define AXIS_NAME\n";
case GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR:
return "#define USE_INSTANCE_COLOR\n";
case GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR:
return "#define USE_FLAT_NORMAL\n";
case GPU_SHADER_2D_UV_UNIFORM_COLOR:
return "#define UV_POS\n";
case GPU_SHADER_2D_UV_EDGES_SMOOTH:
return "#define SMOOTH_COLOR\n";
case GPU_SHADER_3D_UNIFORM_SELECT_ID:
return "#define UNIFORM_ID\n";
case GPU_SHADER_2D_UV_FACES_STRETCH_ANGLE:
return "#define STRETCH_ANGLE\n";
case GPU_SHADER_3D_UNIFORM_COLOR_BACKGROUND:
return "#define USE_BACKGROUND\n";
default:
return NULL;
}
}
GPUShader *GPU_shader_get_builtin_shader(eGPUBuiltinShader shader)
{
BLI_assert(shader != GPU_NUM_BUILTIN_SHADERS); /* don't be a troll */
if (builtin_shaders[shader] == NULL) {
const char *defines = gpu_shader_get_builtin_shader_defines(shader);
const GPUShaderStages *stages = builtin_shader_stages + shader;
const GPUShaderStages *stages = &builtin_shader_stages[shader];
if (shader == GPU_SHADER_EDGES_FRONT_BACK_PERSP && !GLEW_VERSION_3_2) {
/* TODO: remove after switch to core profile (maybe) */
@ -1160,7 +1136,8 @@ GPUShader *GPU_shader_get_builtin_shader(eGPUBuiltinShader shader)
}
/* common case */
builtin_shaders[shader] = GPU_shader_create(stages->vert, stages->frag, stages->geom, NULL, defines, __func__);
builtin_shaders[shader] = GPU_shader_create(
stages->vert, stages->frag, stages->geom, NULL, stages->defs, __func__);
}
return builtin_shaders[shader];
@ -1171,11 +1148,11 @@ void GPU_shader_get_builtin_shader_code(
const char **r_vert, const char **r_frag,
const char **r_geom, const char **r_defines)
{
const GPUShaderStages *stages = builtin_shader_stages + shader;
const GPUShaderStages *stages = &builtin_shader_stages[shader];
*r_vert = stages->vert;
*r_frag = stages->frag;
*r_geom = stages->geom;
*r_defines = gpu_shader_get_builtin_shader_defines(shader);
*r_defines = stages->defs;
}
#define MAX_DEFINES 100