Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/gpu/intern/gpu_shader.c')
-rw-r--r--source/blender/gpu/intern/gpu_shader.c505
1 files changed, 387 insertions, 118 deletions
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 226595200ca..2434ecf01a4 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -36,15 +36,49 @@
#include "GPU_compositing.h"
#include "GPU_debug.h"
#include "GPU_extensions.h"
-#include "GPU_glew.h"
#include "GPU_shader.h"
#include "GPU_texture.h"
+#include "gpu_shader_private.h"
+
/* TODO(sergey): Find better default values for this constants. */
#define MAX_DEFINE_LENGTH 1024
#define MAX_EXT_DEFINE_LENGTH 1024
/* Non-generated shaders */
+extern char datatoc_gpu_shader_depth_only_frag_glsl[];
+extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
+extern char datatoc_gpu_shader_flat_color_frag_glsl[];
+extern char datatoc_gpu_shader_2D_vert_glsl[];
+extern char datatoc_gpu_shader_2D_flat_color_vert_glsl[];
+extern char datatoc_gpu_shader_2D_smooth_color_vert_glsl[];
+extern char datatoc_gpu_shader_2D_smooth_color_frag_glsl[];
+extern char datatoc_gpu_shader_3D_image_vert_glsl[];
+extern char datatoc_gpu_shader_image_modulate_alpha_frag_glsl[];
+extern char datatoc_gpu_shader_image_rect_modulate_alpha_frag_glsl[];
+extern char datatoc_gpu_shader_3D_vert_glsl[];
+extern char datatoc_gpu_shader_3D_flat_color_vert_glsl[];
+extern char datatoc_gpu_shader_3D_smooth_color_vert_glsl[];
+extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
+
+extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[];
+extern char datatoc_gpu_shader_point_uniform_color_smooth_frag_glsl[];
+extern char datatoc_gpu_shader_point_uniform_color_outline_smooth_frag_glsl[];
+extern char datatoc_gpu_shader_point_varying_color_outline_smooth_frag_glsl[];
+extern char datatoc_gpu_shader_point_varying_color_frag_glsl[];
+extern char datatoc_gpu_shader_3D_point_fixed_size_varying_color_vert_glsl[];
+extern char datatoc_gpu_shader_3D_point_varying_size_vert_glsl[];
+extern char datatoc_gpu_shader_3D_point_varying_size_varying_color_vert_glsl[];
+extern char datatoc_gpu_shader_3D_point_uniform_size_smooth_vert_glsl[];
+extern char datatoc_gpu_shader_3D_point_uniform_size_outline_smooth_vert_glsl[];
+extern char datatoc_gpu_shader_2D_point_varying_size_varying_color_vert_glsl[];
+extern char datatoc_gpu_shader_2D_point_uniform_size_smooth_vert_glsl[];
+extern char datatoc_gpu_shader_2D_point_uniform_size_outline_smooth_vert_glsl[];
+extern char datatoc_gpu_shader_2D_point_uniform_size_varying_color_outline_smooth_vert_glsl[];
+
+extern char datatoc_gpu_shader_text_vert_glsl[];
+extern char datatoc_gpu_shader_text_frag_glsl[];
+
extern char datatoc_gpu_shader_fire_frag_glsl[];
extern char datatoc_gpu_shader_smoke_vert_glsl[];
extern char datatoc_gpu_shader_smoke_frag_glsl[];
@@ -81,32 +115,43 @@ static struct GPUShadersGlobal {
GPUShader *minz_downsample;
/* cache for shader fx. Those can exist in combinations so store them here */
GPUShader *fx_shaders[MAX_FX_SHADERS * 2];
+ /* for drawing text */
+ GPUShader *text;
+ /* for drawing images */
+ GPUShader *image_modulate_alpha_3D;
+ GPUShader *image_rect_modulate_alpha_3D;
+ /* for simple 2D drawing */
+ GPUShader *uniform_color_2D;
+ GPUShader *flat_color_2D;
+ GPUShader *smooth_color_2D;
+ /* for simple 3D drawing */
+ GPUShader *uniform_color_3D;
+ GPUShader *flat_color_3D;
+ GPUShader *smooth_color_3D;
+ GPUShader *depth_only_3D;
+ /* points */
+ GPUShader *point_fixed_size_uniform_color_2D;
+ GPUShader *point_varying_size_varying_color_2D;
+ GPUShader *point_uniform_size_uniform_color_smooth_2D;
+ GPUShader *point_uniform_size_uniform_color_outline_smooth_2D;
+ GPUShader *point_uniform_size_varying_color_outline_smooth_2D;
+ GPUShader *point_fixed_size_uniform_color_3D;
+ GPUShader *point_fixed_size_varying_color_3D;
+ GPUShader *point_varying_size_uniform_color_3D;
+ GPUShader *point_varying_size_varying_color_3D;
+ GPUShader *point_uniform_size_uniform_color_smooth_3D;
+ GPUShader *point_uniform_size_uniform_color_outline_smooth_3D;
} shaders;
} GG = {{NULL}};
-/* GPUShader */
-
-struct GPUShader {
- GLuint program; /* handle for full program (links shader stages below) */
-
- GLuint vertex; /* handle for vertex shader */
- GLuint geometry; /* handle for geometry shader */
- GLuint fragment; /* handle for fragment shader */
-
- int totattrib; /* total number of attributes */
- int uniforms; /* required uniforms */
-
- void *uniform_interface; /* cached uniform interface for shader. Data depends on shader */
-};
static void shader_print_errors(const char *task, const char *log, const char **code, int totcode)
{
- int i;
int line = 1;
fprintf(stderr, "GPUShader: %s error:\n", task);
- for (i = 0; i < totcode; i++) {
+ for (int i = 0; i < totcode; i++) {
const char *c, *pos, *end = code[i] + strlen(code[i]);
if (G.debug & G_DEBUG) {
@@ -129,9 +174,9 @@ static void shader_print_errors(const char *task, const char *log, const char **
static const char *gpu_shader_version(void)
{
- if (GLEW_VERSION_3_2) {
- if (GLEW_ARB_compatibility) {
- return "#version 150 compatibility\n";
+ if (GLEW_VERSION_3_3) {
+ if (GPU_legacy_support()) {
+ return "#version 330 compatibility\n";
/* highest version that is widely supported
* gives us native geometry shaders!
* use compatibility profile so we can continue using builtin shader input/output names
@@ -142,16 +187,6 @@ static const char *gpu_shader_version(void)
/* latest version that is compatible with existing shaders */
}
}
- else if (GLEW_VERSION_3_1) {
- if (GLEW_ARB_compatibility) {
- return "#version 140\n";
- /* also need the ARB_compatibility extension, handled below */
- }
- else {
- return "#version 130\n";
- /* latest version that is compatible with existing shaders */
- }
- }
else if (GLEW_VERSION_3_0) {
return "#version 130\n";
/* GLSL 1.3 has modern syntax/keywords/datatypes so use if available
@@ -193,9 +228,8 @@ static void gpu_shader_standard_extensions(char defines[MAX_EXT_DEFINE_LENGTH],
strcat(defines, "#extension GL_ARB_draw_instanced: enable\n");
}
- if (!GLEW_VERSION_3_0 && GLEW_EXT_gpu_shader4) {
- strcat(defines, "#extension GL_EXT_gpu_shader4: enable\n");
- /* TODO: maybe require this? shaders become so much nicer */
+ if (!GLEW_VERSION_3_0) {
+ strcat(defines, "#extension GL_EXT_gpu_shader4: require\n");
}
}
}
@@ -507,20 +541,20 @@ GPUShader *GPU_shader_create_ex(const char *vertexcode,
void GPU_shader_bind(GPUShader *shader)
{
- GPU_ASSERT_NO_GL_ERRORS("Pre Shader Bind");
+ BLI_assert(shader && shader->program);
+
glUseProgram(shader->program);
- GPU_ASSERT_NO_GL_ERRORS("Post Shader Bind");
}
void GPU_shader_unbind(void)
{
- GPU_ASSERT_NO_GL_ERRORS("Pre Shader Unbind");
glUseProgram(0);
- GPU_ASSERT_NO_GL_ERRORS("Post Shader Unbind");
}
void GPU_shader_free(GPUShader *shader)
{
+ BLI_assert(shader);
+
if (shader->vertex)
glDeleteShader(shader->vertex);
if (shader->geometry)
@@ -538,6 +572,8 @@ void GPU_shader_free(GPUShader *shader)
int GPU_shader_get_uniform(GPUShader *shader, const char *name)
{
+ BLI_assert(shader && shader->program);
+
return glGetUniformLocation(shader->program, name);
}
@@ -556,16 +592,12 @@ void GPU_shader_uniform_vector(GPUShader *UNUSED(shader), int location, int leng
if (location == -1 || value == NULL)
return;
- GPU_ASSERT_NO_GL_ERRORS("Pre Uniform Vector");
-
if (length == 1) glUniform1fv(location, arraysize, value);
else if (length == 2) glUniform2fv(location, arraysize, value);
else if (length == 3) glUniform3fv(location, arraysize, value);
else if (length == 4) glUniform4fv(location, arraysize, value);
else if (length == 9) glUniformMatrix3fv(location, arraysize, 0, value);
else if (length == 16) glUniformMatrix4fv(location, arraysize, 0, value);
-
- GPU_ASSERT_NO_GL_ERRORS("Post Uniform Vector");
}
void GPU_shader_uniform_vector_int(GPUShader *UNUSED(shader), int location, int length, int arraysize, const int *value)
@@ -573,14 +605,10 @@ void GPU_shader_uniform_vector_int(GPUShader *UNUSED(shader), int location, int
if (location == -1)
return;
- GPU_ASSERT_NO_GL_ERRORS("Pre Uniform Vector");
-
if (length == 1) glUniform1iv(location, arraysize, value);
else if (length == 2) glUniform2iv(location, arraysize, value);
else if (length == 3) glUniform3iv(location, arraysize, value);
else if (length == 4) glUniform4iv(location, arraysize, value);
-
- GPU_ASSERT_NO_GL_ERRORS("Post Uniform Vector");
}
void GPU_shader_uniform_int(GPUShader *UNUSED(shader), int location, int value)
@@ -588,7 +616,7 @@ void GPU_shader_uniform_int(GPUShader *UNUSED(shader), int location, int value)
if (location == -1)
return;
- GPU_CHECK_ERRORS_AROUND(glUniform1i(location, value));
+ glUniform1i(location, value);
}
void GPU_shader_geometry_stage_primitive_io(GPUShader *shader, int input, int output, int number)
@@ -619,8 +647,6 @@ void GPU_shader_uniform_texture(GPUShader *UNUSED(shader), int location, GPUText
if (location == -1)
return;
- GPU_ASSERT_NO_GL_ERRORS("Pre Uniform Texture");
-
arbnumber = (GLenum)((GLuint)GL_TEXTURE0 + number);
if (number != 0) glActiveTexture(arbnumber);
@@ -631,17 +657,13 @@ void GPU_shader_uniform_texture(GPUShader *UNUSED(shader), int location, GPUText
glUniform1i(location, number);
glEnable(target);
if (number != 0) glActiveTexture(GL_TEXTURE0);
-
- GPU_ASSERT_NO_GL_ERRORS("Post Uniform Texture");
}
int GPU_shader_get_attribute(GPUShader *shader, const char *name)
{
- int index;
-
- GPU_CHECK_ERRORS_AROUND(index = glGetAttribLocation(shader->program, name));
+ BLI_assert(shader && shader->program);
- return index;
+ return glGetAttribLocation(shader->program, name);
}
GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
@@ -659,64 +681,215 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
sprintf(buf, "#define CUBEMAP_RES %d \n", samples);
GG.shaders.compute_sh[shadn] = GPU_shader_create(
- datatoc_gpu_shader_probe_sh_compute_vert_glsl, datatoc_gpu_shader_probe_sh_compute_frag_glsl,
+ datatoc_gpu_shader_probe_sh_compute_vert_glsl,
+ datatoc_gpu_shader_probe_sh_compute_frag_glsl,
NULL, NULL, buf, 0, 0, 0);
}
retval = GG.shaders.compute_sh[shadn];
+ goto exit;
}
- else {
- switch (shader) {
- case GPU_SHADER_VSM_STORE:
- if (!GG.shaders.vsm_store)
- GG.shaders.vsm_store = GPU_shader_create(
- datatoc_gpu_shader_vsm_store_vert_glsl, datatoc_gpu_shader_vsm_store_frag_glsl,
- NULL, NULL, NULL, 0, 0, 0);
- retval = GG.shaders.vsm_store;
- break;
- case GPU_SHADER_SEP_GAUSSIAN_BLUR:
- if (!GG.shaders.sep_gaussian_blur)
- GG.shaders.sep_gaussian_blur = GPU_shader_create(
- datatoc_gpu_shader_sep_gaussian_blur_vert_glsl,
- datatoc_gpu_shader_sep_gaussian_blur_frag_glsl,
- NULL, NULL, NULL, 0, 0, 0);
- retval = GG.shaders.sep_gaussian_blur;
- break;
- case GPU_SHADER_SMOKE:
- if (!GG.shaders.smoke)
- GG.shaders.smoke = GPU_shader_create(
- datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl,
- NULL, NULL, NULL, 0, 0, 0);
- retval = GG.shaders.smoke;
- break;
- case GPU_SHADER_SMOKE_FIRE:
- if (!GG.shaders.smoke_fire)
- GG.shaders.smoke_fire = GPU_shader_create(
- datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_fire_frag_glsl,
- NULL, NULL, NULL, 0, 0, 0);
- retval = GG.shaders.smoke_fire;
- break;
- case GPU_SHADER_DISPLAY_SH:
- if (!GG.shaders.display_sh)
- GG.shaders.display_sh = GPU_shader_create(
- datatoc_gpu_shader_display_sh_vert_glsl, datatoc_gpu_shader_display_sh_frag_glsl,
- NULL, NULL, NULL, 0, 0, 0);
- retval = GG.shaders.display_sh;
- break;
- case GPU_SHADER_MAXZ_DOWNSAMPLE:
- if (!GG.shaders.maxz_downsample)
- GG.shaders.maxz_downsample = GPU_shader_create(
- datatoc_gpu_shader_downsample_maxz_vert_glsl, datatoc_gpu_shader_downsample_maxz_frag_glsl,
- NULL, NULL, NULL, 0, 0, 0);
- case GPU_SHADER_MINZ_DOWNSAMPLE:
- if (!GG.shaders.minz_downsample)
- GG.shaders.minz_downsample = GPU_shader_create(
- datatoc_gpu_shader_downsample_maxz_vert_glsl, datatoc_gpu_shader_downsample_maxz_frag_glsl,
- NULL, NULL, "#define MIN;\n", 0, 0, 0);
- retval = GG.shaders.minz_downsample;
- break;
- }
+
+ switch (shader) {
+ case GPU_SHADER_VSM_STORE:
+ if (!GG.shaders.vsm_store)
+ GG.shaders.vsm_store = GPU_shader_create(
+ datatoc_gpu_shader_vsm_store_vert_glsl, datatoc_gpu_shader_vsm_store_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.vsm_store;
+ break;
+ case GPU_SHADER_SEP_GAUSSIAN_BLUR:
+ if (!GG.shaders.sep_gaussian_blur)
+ GG.shaders.sep_gaussian_blur = GPU_shader_create(
+ datatoc_gpu_shader_sep_gaussian_blur_vert_glsl,
+ datatoc_gpu_shader_sep_gaussian_blur_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.sep_gaussian_blur;
+ break;
+ case GPU_SHADER_SMOKE:
+ if (!GG.shaders.smoke)
+ GG.shaders.smoke = GPU_shader_create(
+ datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.smoke;
+ break;
+ case GPU_SHADER_SMOKE_FIRE:
+ if (!GG.shaders.smoke_fire)
+ GG.shaders.smoke_fire = GPU_shader_create(
+ datatoc_gpu_shader_smoke_vert_glsl, datatoc_gpu_shader_smoke_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.smoke_fire;
+ break;
+ case GPU_SHADER_TEXT:
+ if (!GG.shaders.text)
+ GG.shaders.text = GPU_shader_create(
+ datatoc_gpu_shader_text_vert_glsl,
+ datatoc_gpu_shader_text_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.text;
+ break;
+ case GPU_SHADER_3D_IMAGE_MODULATE_ALPHA:
+ if (!GG.shaders.image_modulate_alpha_3D)
+ GG.shaders.image_modulate_alpha_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_image_vert_glsl,
+ datatoc_gpu_shader_image_modulate_alpha_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.image_modulate_alpha_3D;
+ break;
+ case GPU_SHADER_3D_IMAGE_RECT_MODULATE_ALPHA:
+ if (!GG.shaders.image_rect_modulate_alpha_3D)
+ GG.shaders.image_rect_modulate_alpha_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_image_vert_glsl,
+ datatoc_gpu_shader_image_rect_modulate_alpha_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.image_rect_modulate_alpha_3D;
+ break;
+ case GPU_SHADER_2D_UNIFORM_COLOR:
+ if (!GG.shaders.uniform_color_2D)
+ GG.shaders.uniform_color_2D = GPU_shader_create(
+ datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.uniform_color_2D;
+ break;
+ case GPU_SHADER_2D_FLAT_COLOR:
+ if (!GG.shaders.flat_color_2D)
+ GG.shaders.flat_color_2D = GPU_shader_create(
+ datatoc_gpu_shader_2D_flat_color_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.flat_color_2D;
+ break;
+ case GPU_SHADER_2D_SMOOTH_COLOR:
+ if (!GG.shaders.smooth_color_2D)
+ GG.shaders.smooth_color_2D = GPU_shader_create(
+ datatoc_gpu_shader_2D_smooth_color_vert_glsl,
+ datatoc_gpu_shader_2D_smooth_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.smooth_color_2D;
+ break;
+ case GPU_SHADER_3D_UNIFORM_COLOR:
+ if (!GG.shaders.uniform_color_3D)
+ GG.shaders.uniform_color_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.uniform_color_3D;
+ break;
+ case GPU_SHADER_3D_FLAT_COLOR:
+ if (!GG.shaders.flat_color_3D)
+ GG.shaders.flat_color_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_flat_color_vert_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.flat_color_3D;
+ break;
+ case GPU_SHADER_3D_SMOOTH_COLOR:
+ if (!GG.shaders.smooth_color_3D)
+ GG.shaders.smooth_color_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_smooth_color_vert_glsl,
+ datatoc_gpu_shader_3D_smooth_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.smooth_color_3D;
+ break;
+ case GPU_SHADER_3D_DEPTH_ONLY:
+ if (!GG.shaders.depth_only_3D)
+ GG.shaders.depth_only_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_vert_glsl,
+ datatoc_gpu_shader_depth_only_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.depth_only_3D;
+ break;
+ case GPU_SHADER_2D_POINT_FIXED_SIZE_UNIFORM_COLOR:
+ if (!GG.shaders.point_fixed_size_uniform_color_2D)
+ GG.shaders.point_fixed_size_uniform_color_2D = GPU_shader_create(
+ datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_fixed_size_uniform_color_2D;
+ break;
+ case GPU_SHADER_2D_POINT_VARYING_SIZE_VARYING_COLOR:
+ if (!GG.shaders.point_varying_size_varying_color_2D)
+ GG.shaders.point_varying_size_varying_color_2D = GPU_shader_create(
+ datatoc_gpu_shader_2D_point_varying_size_varying_color_vert_glsl,
+ datatoc_gpu_shader_point_varying_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_varying_size_varying_color_2D;
+ break;
+ case GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_SMOOTH:
+ if (!GG.shaders.point_uniform_size_uniform_color_smooth_2D)
+ GG.shaders.point_uniform_size_uniform_color_smooth_2D = GPU_shader_create(
+ datatoc_gpu_shader_2D_point_uniform_size_smooth_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_smooth_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_uniform_size_uniform_color_smooth_2D;
+ break;
+ case GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_SMOOTH:
+ if (!GG.shaders.point_uniform_size_uniform_color_outline_smooth_2D)
+ GG.shaders.point_uniform_size_uniform_color_outline_smooth_2D = GPU_shader_create(
+ datatoc_gpu_shader_2D_point_uniform_size_outline_smooth_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_outline_smooth_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_uniform_size_uniform_color_outline_smooth_2D;
+ break;
+ case GPU_SHADER_2D_POINT_UNIFORM_SIZE_VARYING_COLOR_OUTLINE_SMOOTH:
+ if (!GG.shaders.point_uniform_size_varying_color_outline_smooth_2D)
+ GG.shaders.point_uniform_size_varying_color_outline_smooth_2D = GPU_shader_create(
+ datatoc_gpu_shader_2D_point_uniform_size_varying_color_outline_smooth_vert_glsl,
+ datatoc_gpu_shader_point_varying_color_outline_smooth_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_uniform_size_varying_color_outline_smooth_2D;
+ break;
+ case GPU_SHADER_3D_POINT_FIXED_SIZE_UNIFORM_COLOR:
+ if (!GG.shaders.point_fixed_size_uniform_color_3D)
+ GG.shaders.point_fixed_size_uniform_color_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_fixed_size_uniform_color_3D;
+ break;
+ case GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR:
+ if (!GG.shaders.point_fixed_size_varying_color_3D)
+ GG.shaders.point_fixed_size_varying_color_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_point_fixed_size_varying_color_vert_glsl,
+ datatoc_gpu_shader_point_varying_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_fixed_size_varying_color_3D;
+ break;
+ case GPU_SHADER_3D_POINT_VARYING_SIZE_UNIFORM_COLOR:
+ if (!GG.shaders.point_varying_size_uniform_color_3D)
+ GG.shaders.point_varying_size_uniform_color_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_point_varying_size_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_varying_size_uniform_color_3D;
+ break;
+ case GPU_SHADER_3D_POINT_VARYING_SIZE_VARYING_COLOR:
+ if (!GG.shaders.point_varying_size_varying_color_3D)
+ GG.shaders.point_varying_size_varying_color_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_point_varying_size_varying_color_vert_glsl,
+ datatoc_gpu_shader_point_varying_color_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_varying_size_varying_color_3D;
+ break;
+ case GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_SMOOTH:
+ if (!GG.shaders.point_uniform_size_uniform_color_smooth_3D)
+ GG.shaders.point_uniform_size_uniform_color_smooth_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_point_uniform_size_smooth_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_smooth_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_uniform_size_uniform_color_smooth_3D;
+ break;
+ case GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_SMOOTH:
+ if (!GG.shaders.point_uniform_size_uniform_color_outline_smooth_3D)
+ GG.shaders.point_uniform_size_uniform_color_outline_smooth_3D = GPU_shader_create(
+ datatoc_gpu_shader_3D_point_uniform_size_outline_smooth_vert_glsl,
+ datatoc_gpu_shader_point_uniform_color_outline_smooth_frag_glsl,
+ NULL, NULL, NULL, 0, 0, 0);
+ retval = GG.shaders.point_uniform_size_uniform_color_outline_smooth_3D;
+ break;
}
+exit:
if (retval == NULL)
printf("Unable to create a GPUShader for builtin shader: %u\n", shader);
@@ -808,8 +981,6 @@ GPUShader *GPU_shader_get_builtin_fx_shader(int effect, bool persp)
void GPU_shader_free_builtin_shaders(void)
{
- int i;
-
if (GG.shaders.vsm_store) {
GPU_shader_free(GG.shaders.vsm_store);
GG.shaders.vsm_store = NULL;
@@ -830,13 +1001,6 @@ void GPU_shader_free_builtin_shaders(void)
GG.shaders.smoke_fire = NULL;
}
- for (i = 0; i < MAX_SH_SAMPLES; ++i) {
- if (GG.shaders.compute_sh[i]) {
- GPU_shader_free(GG.shaders.compute_sh[i]);
- GG.shaders.compute_sh[i] = NULL;
- }
- }
-
if (GG.shaders.display_sh) {
GPU_shader_free(GG.shaders.display_sh);
GG.shaders.display_sh = NULL;
@@ -852,12 +1016,117 @@ void GPU_shader_free_builtin_shaders(void)
GG.shaders.minz_downsample = NULL;
}
- for (i = 0; i < 2 * MAX_FX_SHADERS; ++i) {
+ if (GG.shaders.text) {
+ GPU_shader_free(GG.shaders.text);
+ GG.shaders.text = NULL;
+ }
+
+ if (GG.shaders.image_modulate_alpha_3D) {
+ GPU_shader_free(GG.shaders.image_modulate_alpha_3D);
+ GG.shaders.image_modulate_alpha_3D = NULL;
+ }
+
+ if (GG.shaders.image_rect_modulate_alpha_3D) {
+ GPU_shader_free(GG.shaders.image_rect_modulate_alpha_3D);
+ GG.shaders.image_rect_modulate_alpha_3D = NULL;
+ }
+
+ if (GG.shaders.uniform_color_2D) {
+ GPU_shader_free(GG.shaders.uniform_color_2D);
+ GG.shaders.uniform_color_2D = NULL;
+ }
+
+ if (GG.shaders.flat_color_2D) {
+ GPU_shader_free(GG.shaders.flat_color_2D);
+ GG.shaders.flat_color_2D = NULL;
+ }
+
+ if (GG.shaders.smooth_color_2D) {
+ GPU_shader_free(GG.shaders.smooth_color_2D);
+ GG.shaders.smooth_color_2D = NULL;
+ }
+
+ if (GG.shaders.uniform_color_3D) {
+ GPU_shader_free(GG.shaders.uniform_color_3D);
+ GG.shaders.uniform_color_3D = NULL;
+ }
+
+ if (GG.shaders.flat_color_3D) {
+ GPU_shader_free(GG.shaders.flat_color_3D);
+ GG.shaders.flat_color_3D = NULL;
+ }
+
+ if (GG.shaders.smooth_color_3D) {
+ GPU_shader_free(GG.shaders.smooth_color_3D);
+ GG.shaders.smooth_color_3D = NULL;
+ }
+
+ if (GG.shaders.point_fixed_size_uniform_color_2D) {
+ GPU_shader_free(GG.shaders.point_fixed_size_uniform_color_2D);
+ GG.shaders.point_fixed_size_uniform_color_2D = NULL;
+ }
+
+ if (GG.shaders.point_varying_size_varying_color_2D) {
+ GPU_shader_free(GG.shaders.point_varying_size_varying_color_2D);
+ GG.shaders.point_varying_size_varying_color_2D = NULL;
+ }
+
+ if (GG.shaders.point_uniform_size_uniform_color_smooth_2D) {
+ GPU_shader_free(GG.shaders.point_uniform_size_uniform_color_smooth_2D);
+ GG.shaders.point_uniform_size_uniform_color_smooth_2D = NULL;
+ }
+
+ if (GG.shaders.point_uniform_size_uniform_color_outline_smooth_2D) {
+ GPU_shader_free(GG.shaders.point_uniform_size_uniform_color_outline_smooth_2D);
+ GG.shaders.point_uniform_size_uniform_color_outline_smooth_2D = NULL;
+ }
+
+ if (GG.shaders.point_uniform_size_varying_color_outline_smooth_2D) {
+ GPU_shader_free(GG.shaders.point_uniform_size_varying_color_outline_smooth_2D);
+ GG.shaders.point_uniform_size_varying_color_outline_smooth_2D = NULL;
+ }
+
+ if (GG.shaders.point_fixed_size_uniform_color_3D) {
+ GPU_shader_free(GG.shaders.point_fixed_size_uniform_color_3D);
+ GG.shaders.point_fixed_size_uniform_color_3D = NULL;
+ }
+
+ if (GG.shaders.point_fixed_size_varying_color_3D) {
+ GPU_shader_free(GG.shaders.point_fixed_size_varying_color_3D);
+ GG.shaders.point_fixed_size_varying_color_3D = NULL;
+ }
+
+ if (GG.shaders.point_varying_size_uniform_color_3D) {
+ GPU_shader_free(GG.shaders.point_varying_size_uniform_color_3D);
+ GG.shaders.point_varying_size_uniform_color_3D = NULL;
+ }
+
+ if (GG.shaders.point_varying_size_varying_color_3D) {
+ GPU_shader_free(GG.shaders.point_varying_size_varying_color_3D);
+ GG.shaders.point_varying_size_varying_color_3D = NULL;
+ }
+
+ if (GG.shaders.point_uniform_size_uniform_color_smooth_3D) {
+ GPU_shader_free(GG.shaders.point_uniform_size_uniform_color_smooth_3D);
+ GG.shaders.point_uniform_size_uniform_color_smooth_3D = NULL;
+ }
+
+ if (GG.shaders.point_uniform_size_uniform_color_outline_smooth_3D) {
+ GPU_shader_free(GG.shaders.point_uniform_size_uniform_color_outline_smooth_3D);
+ GG.shaders.point_uniform_size_uniform_color_outline_smooth_3D = NULL;
+ }
+
+ for (int i = 0; i < MAX_SH_SAMPLES; ++i) {
+ if (GG.shaders.compute_sh[i]) {
+ GPU_shader_free(GG.shaders.compute_sh[i]);
+ GG.shaders.compute_sh[i] = NULL;
+ }
+ }
+
+ for (int i = 0; i < 2 * MAX_FX_SHADERS; ++i) {
if (GG.shaders.fx_shaders[i]) {
GPU_shader_free(GG.shaders.fx_shaders[i]);
GG.shaders.fx_shaders[i] = NULL;
}
}
}
-
-