[gtk+] gdkgl: Clean up program-manipulating code
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gdkgl: Clean up program-manipulating code
- Date: Sat, 22 Nov 2014 18:39:39 +0000 (UTC)
commit 28846536cbe01090844cdb35001fbc2834a1118b
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Sat Nov 22 09:29:27 2014 -0800
gdkgl: Clean up program-manipulating code
Abstract the program ID and locations into a "program struct" which
we then use.
gdk/gdkgl.c | 96 ++++++++++++++++++---------------------------
gdk/gdkglcontextprivate.h | 21 ++++++----
2 files changed, 50 insertions(+), 67 deletions(-)
---
diff --git a/gdk/gdkgl.c b/gdk/gdkgl.c
index 6c76e83..956d416 100644
--- a/gdk/gdkgl.c
+++ b/gdk/gdkgl.c
@@ -82,50 +82,53 @@ create_shader (int type, const char const *code)
return shader;
}
-static guint
-make_program (const char const *vertex_shader_code, const char const *fragment_shader_code)
+static void
+make_program (GdkGLContextProgram *program,
+ const char const *vertex_shader_code,
+ const char const *fragment_shader_code)
{
- guint program, vertex_shader, fragment_shader;
+ guint vertex_shader, fragment_shader;
int status;
vertex_shader = create_shader (GL_VERTEX_SHADER, vertex_shader_code);
if (vertex_shader == 0)
- return 0;
+ return;
fragment_shader = create_shader (GL_FRAGMENT_SHADER, fragment_shader_code);
if (fragment_shader == 0)
{
glDeleteShader (vertex_shader);
- return 0;
+ return;
}
- program = glCreateProgram ();
- glAttachShader (program, vertex_shader);
- glAttachShader (program, fragment_shader);
+ program->program = glCreateProgram ();
+ glAttachShader (program->program, vertex_shader);
+ glAttachShader (program->program, fragment_shader);
- glLinkProgram (program);
+ glLinkProgram (program->program);
glDeleteShader (vertex_shader);
glDeleteShader (fragment_shader);
- glGetProgramiv (program, GL_LINK_STATUS, &status);
+ glGetProgramiv (program->program, GL_LINK_STATUS, &status);
if (status == GL_FALSE)
{
int log_len;
char *buffer;
- glGetProgramiv (program, GL_INFO_LOG_LENGTH, &log_len);
+ glGetProgramiv (program->program, GL_INFO_LOG_LENGTH, &log_len);
buffer = g_malloc (log_len + 1);
- glGetProgramInfoLog (program, log_len, NULL, buffer);
+ glGetProgramInfoLog (program->program, log_len, NULL, buffer);
g_warning ("Linker failure: %s\n", buffer);
g_free (buffer);
- glDeleteProgram (program);
- return 0;
+ glDeleteProgram (program->program);
}
- return program;
+ program->position_location = glGetAttribLocation (program->program, "position");
+ program->uv_location = glGetAttribLocation (program->program, "uv");
+ program->map_location = glGetUniformLocation (program->program, "map");
}
static void
@@ -140,10 +143,7 @@ bind_vao (GdkGLContextPaintData *paint_data)
}
static void
-use_texture_2d_program (GdkGLContextPaintData *paint_data,
- guint *position_location,
- guint *uv_location,
- guint *map_location)
+use_texture_2d_program (GdkGLContextPaintData *paint_data)
{
const char *vertex_shader_code =
"#version 120\n"
@@ -163,30 +163,18 @@ use_texture_2d_program (GdkGLContextPaintData *paint_data,
" gl_FragColor = texture2D (map, vUv);\n"
"}\n";
- if (paint_data->texture_quad_program == 0)
- {
- paint_data->texture_quad_program = make_program (vertex_shader_code, fragment_shader_code);
- paint_data->texture_quad_program_position_location = glGetAttribLocation
(paint_data->texture_quad_program, "position");
- paint_data->texture_quad_program_uv_location = glGetAttribLocation (paint_data->texture_quad_program,
"uv");
- paint_data->texture_quad_program_map_location = glGetUniformLocation
(paint_data->texture_quad_program, "map");
- }
+ if (paint_data->texture_2d_quad_program.program == 0)
+ make_program (&paint_data->texture_2d_quad_program, vertex_shader_code, fragment_shader_code);
- if (paint_data->current_program != paint_data->texture_quad_program)
+ if (paint_data->current_program != &paint_data->texture_2d_quad_program)
{
- glUseProgram (paint_data->texture_quad_program);
- paint_data->current_program = paint_data->texture_quad_program;
+ paint_data->current_program = &paint_data->texture_2d_quad_program;
+ glUseProgram (paint_data->current_program->program);
}
-
- *position_location = paint_data->texture_quad_program_position_location;
- *uv_location = paint_data->texture_quad_program_uv_location;
- *map_location = paint_data->texture_quad_program_map_location;
}
static void
-use_texture_rect_program (GdkGLContextPaintData *paint_data,
- guint *position_location,
- guint *uv_location,
- guint *map_location)
+use_texture_rect_program (GdkGLContextPaintData *paint_data)
{
const char *vertex_shader_code =
"#version 120\n"
@@ -206,26 +194,16 @@ use_texture_rect_program (GdkGLContextPaintData *paint_data,
" gl_FragColor = texture2DRect (map, vUv);\n"
"}\n";
- if (paint_data->texture_quad_rect_program == 0)
- {
- paint_data->texture_quad_rect_program = make_program (vertex_shader_code, fragment_shader_code);
- paint_data->texture_quad_rect_program_position_location = glGetAttribLocation
(paint_data->texture_quad_rect_program, "position");
- paint_data->texture_quad_rect_program_uv_location = glGetAttribLocation
(paint_data->texture_quad_rect_program, "uv");
- paint_data->texture_quad_rect_program_map_location = glGetUniformLocation
(paint_data->texture_quad_rect_program, "map");
- }
+ if (paint_data->texture_rect_quad_program.program == 0)
+ make_program (&paint_data->texture_rect_quad_program, vertex_shader_code, fragment_shader_code);
- if (paint_data->current_program != paint_data->texture_quad_rect_program)
+ if (paint_data->current_program != &paint_data->texture_rect_quad_program)
{
- glUseProgram (paint_data->texture_quad_rect_program);
- paint_data->current_program = paint_data->texture_quad_rect_program;
+ paint_data->current_program = &paint_data->texture_rect_quad_program;
+ glUseProgram (paint_data->current_program->program);
}
-
- *position_location = paint_data->texture_quad_rect_program_position_location;
- *uv_location = paint_data->texture_quad_rect_program_uv_location;
- *map_location = paint_data->texture_quad_rect_program_map_location;
}
-
void
gdk_gl_texture_quad (GdkGLContext *paint_context,
guint texture_target,
@@ -235,6 +213,7 @@ gdk_gl_texture_quad (GdkGLContext *paint_context,
float u2, float v2)
{
GdkGLContextPaintData *paint_data = gdk_gl_context_get_paint_data (paint_context);
+ GdkGLContextProgram *program;
GdkWindow *window = gdk_gl_context_get_window (paint_context);
int window_scale = gdk_window_get_scale_factor (window);
float w = gdk_window_get_width (window) * window_scale;
@@ -251,7 +230,6 @@ gdk_gl_texture_quad (GdkGLContext *paint_context,
u1, v2,
u1, v1,
};
- guint position_location, uv_location, map_location;
bind_vao (paint_data);
@@ -262,21 +240,23 @@ gdk_gl_texture_quad (GdkGLContext *paint_context,
glGenBuffers(1, &paint_data->tmp_uv_buffer);
if (texture_target == GL_TEXTURE_RECTANGLE_ARB)
- use_texture_rect_program (paint_data, &position_location, &uv_location, &map_location);
+ use_texture_rect_program (paint_data);
else
- use_texture_2d_program (paint_data, &position_location, &uv_location, &map_location);
+ use_texture_2d_program (paint_data);
+
+ program = paint_data->current_program;
glActiveTexture (GL_TEXTURE0);
- glUniform1i(map_location, 0); /* Use texture unit 0 */
+ glUniform1i(program->map_location, 0); /* Use texture unit 0 */
glEnableVertexAttribArray (0);
glBindBuffer (GL_ARRAY_BUFFER, paint_data->tmp_vertex_buffer);
glBufferData (GL_ARRAY_BUFFER, sizeof(vertex_buffer_data), vertex_buffer_data, GL_STREAM_DRAW);
- glVertexAttribPointer (position_location, 2, GL_FLOAT, GL_FALSE, 0, NULL);
+ glVertexAttribPointer (program->position_location, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray (1);
glBindBuffer (GL_ARRAY_BUFFER, paint_data->tmp_uv_buffer);
glBufferData (GL_ARRAY_BUFFER, sizeof(uv_buffer_data), uv_buffer_data, GL_STREAM_DRAW);
- glVertexAttribPointer (uv_location, 2, GL_FLOAT, GL_FALSE, 0, NULL);
+ glVertexAttribPointer (program->uv_location, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glDrawArrays (GL_TRIANGLE_FAN, 0, 4);
glDisableVertexAttribArray (0);
glDisableVertexAttribArray (1);
diff --git a/gdk/gdkglcontextprivate.h b/gdk/gdkglcontextprivate.h
index 9a4ee46..ebe5e18 100644
--- a/gdk/gdkglcontextprivate.h
+++ b/gdk/gdkglcontextprivate.h
@@ -49,19 +49,22 @@ struct _GdkGLContextClass
};
typedef struct {
+ guint program;
+ guint position_location;
+ guint uv_location;
+ guint map_location;
+} GdkGLContextProgram;
+
+typedef struct {
guint vertex_array_object;
guint tmp_framebuffer;
guint tmp_vertex_buffer;
guint tmp_uv_buffer;
- guint current_program;
- guint texture_quad_program;
- guint texture_quad_program_position_location;
- guint texture_quad_program_uv_location;
- guint texture_quad_program_map_location;
- guint texture_quad_rect_program;
- guint texture_quad_rect_program_position_location;
- guint texture_quad_rect_program_uv_location;
- guint texture_quad_rect_program_map_location;
+
+ GdkGLContextProgram texture_2d_quad_program;
+ GdkGLContextProgram texture_rect_quad_program;
+
+ GdkGLContextProgram *current_program;
} GdkGLContextPaintData;
GdkGLContextPaintData *gdk_gl_context_get_paint_data (GdkGLContext *context);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]