[retro-gtk/wip/aplazas/gl-display: 10/10] draw the texture but doesn't update…
- From: Adrien Plazas <aplazas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [retro-gtk/wip/aplazas/gl-display: 10/10] draw the texture but doesn't update…
- Date: Mon, 13 Nov 2017 14:12:00 +0000 (UTC)
commit 1499ac120cc3d5ec2c5ad868013de5fd4c89911a
Author: Adrien Plazas <kekun plazas laposte net>
Date: Mon Nov 13 15:06:48 2017 +0100
draw the texture but doesn't update…
retro-gtk/retro-gl-display-fragment.glsl | 9 ++--
retro-gtk/retro-gl-display-vertex.glsl | 6 +-
retro-gtk/retro-gl-display.c | 61 ++++++++++++++++++++----------
3 files changed, 48 insertions(+), 28 deletions(-)
---
diff --git a/retro-gtk/retro-gl-display-fragment.glsl b/retro-gtk/retro-gl-display-fragment.glsl
index 8747d24..aa70c52 100644
--- a/retro-gtk/retro-gl-display-fragment.glsl
+++ b/retro-gtk/retro-gl-display-fragment.glsl
@@ -1,12 +1,11 @@
#version 150 core
-in vec3 Color;
+in vec2 texture_coordinates_frag;
+out vec4 out_color;
-out vec4 outColor;
-
-uniform float triangleColor;
+uniform sampler2D video;
void main ()
{
- outColor = vec4 (Color * triangleColor, 1.0);
+ out_color = texture (video, texture_coordinates_frag);
}
diff --git a/retro-gtk/retro-gl-display-vertex.glsl b/retro-gtk/retro-gl-display-vertex.glsl
index aa8c092..c7b54e8 100644
--- a/retro-gtk/retro-gl-display-vertex.glsl
+++ b/retro-gtk/retro-gl-display-vertex.glsl
@@ -1,12 +1,12 @@
#version 150 core
in vec2 position;
-in vec3 color;
+in vec2 texture_coordinates;
-out vec3 Color;
+out vec2 texture_coordinates_frag;
void main ()
{
- Color = color;
+ texture_coordinates_frag = texture_coordinates;
gl_Position = vec4 (position, 0.0, 1.0);
}
diff --git a/retro-gtk/retro-gl-display.c b/retro-gtk/retro-gl-display.c
index c61ba40..a54f6d8 100644
--- a/retro-gtk/retro-gl-display.c
+++ b/retro-gtk/retro-gl-display.c
@@ -69,11 +69,29 @@ retro_gl_display_get_video_box (RetroGLDisplay *self,
*y = (h - *height) / 2;
}
+typedef struct {
+ struct {
+ float x, y;
+ } position;
+ struct {
+ float x, y;
+ } texture_coordinates;
+} RetroVertex;
+
+/* float vertices[] = { */
+/* // Position Texcoords */
+/* -0.5f, 0.5f, 0.0f, 0.0f, // Top-left */
+/* 0.5f, 0.5f, 1.0f, 0.0f, // Top-right */
+/* 0.5f, -0.5f, 1.0f, 1.0f, // Bottom-right */
+/* -0.5f, -0.5f, 0.0f, 1.0f, // Bottom-left */
+/* }; */
+
float vertices[] = {
- -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // Top-left
- 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // Top-right
- 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-right
- -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, // Bottom-left
+// Position Texcoords
+ -0.5f, 0.5f, 0.0f, 0.0f, // Top-left
+ 0.5f, 0.5f, 1.0f, 0.0f, // Top-right
+ 0.5f, -0.5f, 1.0f, 1.0f, // Bottom-right
+ -0.5f, -0.5f, 0.0f, 1.0f, // Bottom-left
};
GLuint elements[] = {
@@ -130,14 +148,14 @@ retro_gl_display_realize (RetroGLDisplay *self)
glUseProgram (shader_program);
GLint position_attrib = glGetAttribLocation (shader_program, "position");
- glVertexAttribPointer (position_attrib, 2, GL_FLOAT, GL_FALSE,
- 5 * sizeof (float), 0);
+ glVertexAttribPointer (position_attrib, sizeof (((RetroVertex *) NULL)->position) / sizeof (float),
GL_FLOAT, GL_FALSE,
+ sizeof (RetroVertex), offsetof (RetroVertex, position));
glEnableVertexAttribArray (position_attrib);
- GLint colAttrib = glGetAttribLocation (shader_program, "color");
- glEnableVertexAttribArray (colAttrib);
- glVertexAttribPointer (colAttrib, 3, GL_FLOAT, GL_FALSE,
- 5 * sizeof (float), (void *) (2 * sizeof(float)));
+ GLint texture_coordinates_attrib = glGetAttribLocation (shader_program, "texture_coordinates");
+ glVertexAttribPointer (texture_coordinates_attrib, sizeof (((RetroVertex *) NULL)->texture_coordinates) /
sizeof (float), GL_FLOAT, GL_FALSE,
+ sizeof (RetroVertex), offsetof (RetroVertex, texture_coordinates));
+ glEnableVertexAttribArray (texture_coordinates_attrib);
self->shader_program = shader_program;
}
@@ -177,9 +195,8 @@ retro_gl_display_render (RetroGLDisplay *self)
}
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glUseProgram (self->shader_program);
- GLint uniColor = glGetUniformLocation (self->shader_program, "triangleColor");
- glUniform1f (uniColor, (g_get_monotonic_time () % 1000000) / 1000000.0f);
+ GLint rect = glGetUniformLocation (self->shader_program, "rect");
+ glUniform4f (rect, x, y, w, h);
glBindFramebuffer (GL_READ_FRAMEBUFFER, self->framebuffer);
glBlitFramebuffer (0, 0,
@@ -190,7 +207,6 @@ retro_gl_display_render (RetroGLDisplay *self)
filter);
glBindFramebuffer (GL_READ_FRAMEBUFFER, 0);
- /* glDrawArrays (GL_TRIANGLES, 0, 3); */
glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
return FALSE;
@@ -409,14 +425,19 @@ retro_gl_display_set_pixbuf (RetroGLDisplay *self,
gdk_pixbuf_get_width (self->pixbuf),
gdk_pixbuf_get_height (self->pixbuf),
0,
- GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV,
+ GL_RGBA, GL_UNSIGNED_BYTE,
gdk_pixbuf_get_pixels (self->pixbuf));
- glGenFramebuffers(1, &self->framebuffer);
- glBindFramebuffer(GL_READ_FRAMEBUFFER, self->framebuffer);
- glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D, tex, 0);
- glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glGenFramebuffers (1, &self->framebuffer);
+ glBindFramebuffer (GL_READ_FRAMEBUFFER, self->framebuffer);
+ glFramebufferTexture2D (GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D, tex, 0);
+ glBindFramebuffer (GL_READ_FRAMEBUFFER, 0);
}
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PIXBUF]);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]