[retro-gtk/wip/aplazas/gl-display: 10/10] draw the texture but doesn't update…



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]