Blame ext/gl/gltestsrc.c

Packit 971217
/* GStreamer
Packit 971217
 * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
Packit 971217
 * Copyright (C) <2016> Matthew Waters <matthew@centricular.com>
Packit 971217
 *
Packit 971217
 * This library is free software; you can redistribute it and/or
Packit 971217
 * modify it under the terms of the GNU Library General Public
Packit 971217
 * License as published by the Free Software Foundation; either
Packit 971217
 * version 2 of the License, or (at your option) any later version.
Packit 971217
 *
Packit 971217
 * This library is distributed in the hope that it will be useful,
Packit 971217
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 971217
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 971217
 * Library General Public License for more details.
Packit 971217
 *
Packit 971217
 * You should have received a copy of the GNU Library General Public
Packit 971217
 * License along with this library; if not, write to the
Packit 971217
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit 971217
 * Boston, MA 02110-1301, USA.
Packit 971217
 */
Packit 971217
Packit 971217
#ifdef HAVE_CONFIG_H
Packit 971217
#include "config.h"
Packit 971217
#endif
Packit 971217
Packit 971217
#include <gst/gl/gstglfuncs.h>
Packit 971217
Packit 971217
#include "gltestsrc.h"
Packit 971217
Packit 971217
#define MAX_ATTRIBUTES 4
Packit 971217
Packit 971217
struct vts_color_struct
Packit 971217
{
Packit 971217
  gfloat R, G, B;
Packit 971217
};
Packit 971217
Packit 971217
struct XYZWRGB
Packit 971217
{
Packit 971217
  gfloat X, Y, Z, W, R, G, B;
Packit 971217
};
Packit 971217
Packit 971217
enum
Packit 971217
{
Packit 971217
  COLOR_WHITE = 0,
Packit 971217
  COLOR_YELLOW,
Packit 971217
  COLOR_CYAN,
Packit 971217
  COLOR_GREEN,
Packit 971217
  COLOR_MAGENTA,
Packit 971217
  COLOR_RED,
Packit 971217
  COLOR_BLUE,
Packit 971217
  COLOR_BLACK,
Packit 971217
  COLOR_NEG_I,
Packit 971217
  COLOR_POS_Q,
Packit 971217
  COLOR_SUPER_BLACK,
Packit 971217
  COLOR_DARK_GREY
Packit 971217
};
Packit 971217
Packit 971217
static const struct vts_color_struct vts_colors[] = {
Packit 971217
  /* 100% white */
Packit 971217
  {1.0f, 1.0f, 1.0f},
Packit 971217
  /* yellow */
Packit 971217
  {1.0f, 1.0f, 0.0f},
Packit 971217
  /* cyan */
Packit 971217
  {0.0f, 1.0f, 1.0f},
Packit 971217
  /* green */
Packit 971217
  {0.0f, 1.0f, 0.0f},
Packit 971217
  /* magenta */
Packit 971217
  {1.0f, 0.0f, 1.0f},
Packit 971217
  /* red */
Packit 971217
  {1.0f, 0.0f, 0.0f},
Packit 971217
  /* blue */
Packit 971217
  {0.0f, 0.0f, 1.0f},
Packit 971217
  /* black */
Packit 971217
  {0.0f, 0.0f, 0.0f},
Packit 971217
  /* -I */
Packit 971217
  {0.0, 0.0f, 0.5f},
Packit 971217
  /* +Q */
Packit 971217
  {0.0f, 0.5, 1.0f},
Packit 971217
  /* superblack */
Packit 971217
  {0.0f, 0.0f, 0.0f},
Packit 971217
  /* 7.421875% grey */
Packit 971217
  {19. / 256.0f, 19. / 256.0f, 19. / 256.0},
Packit 971217
};
Packit 971217
Packit 971217
/* *INDENT-OFF* */
Packit 971217
static const GLfloat positions[] = {
Packit 971217
     -1.0,  1.0,  0.0, 1.0,
Packit 971217
      1.0,  1.0,  0.0, 1.0,
Packit 971217
      1.0, -1.0,  0.0, 1.0,
Packit 971217
     -1.0, -1.0,  0.0, 1.0,
Packit 971217
};
Packit 971217
Packit 971217
static const GLushort indices_quad[] = { 0, 1, 2, 0, 2, 3 };
Packit 971217
/* *INDENT-ON* */
Packit 971217
Packit 971217
struct attribute
Packit 971217
{
Packit 971217
  const gchar *name;
Packit 971217
  gint location;
Packit 971217
  guint n_elements;
Packit 971217
  GLenum element_type;
Packit 971217
  guint offset;                 /* in bytes */
Packit 971217
  guint stride;                 /* in bytes */
Packit 971217
};
Packit 971217
Packit 971217
struct SrcShader
Packit 971217
{
Packit 971217
  struct BaseSrcImpl base;
Packit 971217
Packit 971217
  GstGLShader *shader;
Packit 971217
Packit 971217
  guint vao;
Packit 971217
  guint vbo;
Packit 971217
  guint vbo_indices;
Packit 971217
Packit 971217
  guint n_attributes;
Packit 971217
  struct attribute attributes[MAX_ATTRIBUTES];
Packit 971217
Packit 971217
  gconstpointer vertices;
Packit 971217
  gsize vertices_size;
Packit 971217
  const gushort *indices;
Packit 971217
  guint index_offset;
Packit 971217
  guint n_indices;
Packit 971217
};
Packit 971217
Packit 971217
static void
Packit 971217
_bind_buffer (struct SrcShader *src)
Packit 971217
{
Packit 971217
  GstGLContext *context = src->base.context;
Packit 971217
  const GstGLFuncs *gl = context->gl_vtable;
Packit 971217
  gint i;
Packit 971217
Packit 971217
  gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, src->vbo_indices);
Packit 971217
  gl->BindBuffer (GL_ARRAY_BUFFER, src->vbo);
Packit 971217
Packit 971217
  /* Load the vertex position */
Packit 971217
  for (i = 0; i < src->n_attributes; i++) {
Packit 971217
    struct attribute *attr = &src->attributes[i];
Packit 971217
Packit 971217
    if (attr->location == -1)
Packit 971217
      attr->location =
Packit 971217
          gst_gl_shader_get_attribute_location (src->shader, attr->name);
Packit 971217
Packit 971217
    gl->VertexAttribPointer (attr->location, attr->n_elements,
Packit 971217
        attr->element_type, GL_FALSE, attr->stride,
Packit 971217
        (void *) (gintptr) attr->offset);
Packit 971217
Packit 971217
    gl->EnableVertexAttribArray (attr->location);
Packit 971217
  }
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
_unbind_buffer (struct SrcShader *src)
Packit 971217
{
Packit 971217
  GstGLContext *context = src->base.context;
Packit 971217
  const GstGLFuncs *gl = context->gl_vtable;
Packit 971217
  gint i;
Packit 971217
Packit 971217
  gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
Packit 971217
  gl->BindBuffer (GL_ARRAY_BUFFER, 0);
Packit 971217
Packit 971217
  for (i = 0; i < src->n_attributes; i++) {
Packit 971217
    struct attribute *attr = &src->attributes[i];
Packit 971217
Packit 971217
    gl->DisableVertexAttribArray (attr->location);
Packit 971217
  }
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_shader_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
  const GstGLFuncs *gl = context->gl_vtable;
Packit 971217
Packit 971217
  src->base.context = context;
Packit 971217
Packit 971217
  if (!src->vbo) {
Packit 971217
    if (gl->GenVertexArrays) {
Packit 971217
      gl->GenVertexArrays (1, &src->vao);
Packit 971217
      gl->BindVertexArray (src->vao);
Packit 971217
    }
Packit 971217
Packit 971217
    gl->GenBuffers (1, &src->vbo);
Packit 971217
    gl->BindBuffer (GL_ARRAY_BUFFER, src->vbo);
Packit 971217
    gl->BufferData (GL_ARRAY_BUFFER, src->vertices_size,
Packit 971217
        src->vertices, GL_STATIC_DRAW);
Packit 971217
Packit 971217
    gl->GenBuffers (1, &src->vbo_indices);
Packit 971217
    gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, src->vbo_indices);
Packit 971217
    gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, src->n_indices * sizeof (gushort),
Packit 971217
        src->indices, GL_STATIC_DRAW);
Packit 971217
Packit 971217
    if (gl->GenVertexArrays) {
Packit 971217
      _bind_buffer (src);
Packit 971217
      gl->BindVertexArray (0);
Packit 971217
    }
Packit 971217
Packit 971217
    gl->BindBuffer (GL_ARRAY_BUFFER, 0);
Packit 971217
    gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
Packit 971217
  }
Packit 971217
Packit 971217
  return TRUE;
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_shader_fill_bound_fbo (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
  const GstGLFuncs *gl;
Packit 971217
Packit 971217
  g_return_val_if_fail (src->base.context, FALSE);
Packit 971217
  g_return_val_if_fail (src->shader, FALSE);
Packit 971217
  gl = src->base.context->gl_vtable;
Packit 971217
Packit 971217
  gst_gl_shader_use (src->shader);
Packit 971217
Packit 971217
  if (gl->GenVertexArrays)
Packit 971217
    gl->BindVertexArray (src->vao);
Packit 971217
  _bind_buffer (src);
Packit 971217
Packit 971217
  gl->DrawElements (GL_TRIANGLES, src->n_indices, GL_UNSIGNED_SHORT,
Packit 971217
      (gpointer) (gintptr) src->index_offset);
Packit 971217
Packit 971217
  if (gl->GenVertexArrays)
Packit 971217
    gl->BindVertexArray (0);
Packit 971217
  _unbind_buffer (src);
Packit 971217
Packit 971217
  gst_gl_context_clear_shader (src->base.context);
Packit 971217
Packit 971217
  return TRUE;
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
_src_shader_deinit (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
  const GstGLFuncs *gl = src->base.context->gl_vtable;
Packit 971217
Packit 971217
  if (src->shader)
Packit 971217
    gst_object_unref (src->shader);
Packit 971217
  src->shader = NULL;
Packit 971217
Packit 971217
  if (src->vao)
Packit 971217
    gl->DeleteVertexArrays (1, &src->vao);
Packit 971217
  src->vao = 0;
Packit 971217
Packit 971217
  if (src->vbo)
Packit 971217
    gl->DeleteBuffers (1, &src->vbo);
Packit 971217
  src->vbo = 0;
Packit 971217
Packit 971217
  if (src->vbo_indices)
Packit 971217
    gl->DeleteBuffers (1, &src->vbo_indices);
Packit 971217
  src->vbo_indices = 0;
Packit 971217
}
Packit 971217
Packit 971217
/* *INDENT-OFF* */
Packit 971217
static const gchar *smpte_vertex_src =
Packit 971217
    "attribute vec4 position;\n"
Packit 971217
    "attribute vec4 a_color;\n"
Packit 971217
    "varying vec4 color;\n"
Packit 971217
    "void main()\n"
Packit 971217
    "{\n"
Packit 971217
    "  gl_Position = position;\n"
Packit 971217
    "  color = a_color;\n"
Packit 971217
    "}";
Packit 971217
Packit 971217
static const gchar *smpte_fragment_src =
Packit 971217
    "#ifdef GL_ES\n"
Packit 971217
    "precision mediump float;\n"
Packit 971217
    "#endif\n"
Packit 971217
    "varying vec4 color;\n"
Packit 971217
    "void main()\n"
Packit 971217
    "{\n"
Packit 971217
    "  gl_FragColor = color;\n"
Packit 971217
    "}";
Packit 971217
Packit 971217
static const gchar *snow_vertex_src =
Packit 971217
    "attribute vec4 position;\n"
Packit 971217
    "varying vec2 out_uv;\n"
Packit 971217
    "void main()\n"
Packit 971217
    "{\n"
Packit 971217
    "   gl_Position = position;\n"
Packit 971217
    "   out_uv = position.xy;\n"
Packit 971217
    "}";
Packit 971217
Packit 971217
static const gchar *snow_fragment_src = 
Packit 971217
    "#ifdef GL_ES\n"
Packit 971217
    "precision mediump float;\n"
Packit 971217
    "#endif\n"
Packit 971217
    "uniform float time;\n"
Packit 971217
    "varying vec2 out_uv;\n"
Packit 971217
    "\n"
Packit 971217
    "float rand(vec2 co){\n"
Packit 971217
    "    return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);\n"
Packit 971217
    "}\n"
Packit 971217
    "void main()\n"
Packit 971217
    "{\n"
Packit 971217
    "  gl_FragColor = vec4(rand(time * out_uv));\n"
Packit 971217
    "}";
Packit 971217
/* *INDENT-ON* */
Packit 971217
Packit 971217
#define N_QUADS 21
Packit 971217
struct SrcSMPTE
Packit 971217
{
Packit 971217
  struct SrcShader base;
Packit 971217
Packit 971217
  GstGLShader *snow_shader;
Packit 971217
  GstGLShader *color_shader;
Packit 971217
  gint attr_snow_position;
Packit 971217
};
Packit 971217
Packit 971217
static gpointer
Packit 971217
_src_smpte_new (GstGLTestSrc * test)
Packit 971217
{
Packit 971217
  struct SrcSMPTE *src = g_new0 (struct SrcSMPTE, 1);
Packit 971217
Packit 971217
  src->base.base.src = test;
Packit 971217
Packit 971217
  return src;
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_smpte_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
Packit 971217
{
Packit 971217
  struct SrcSMPTE *src = impl;
Packit 971217
  struct XYZWRGB *coord;
Packit 971217
  gushort *plane_indices;
Packit 971217
  GError *error = NULL;
Packit 971217
  int color_idx = 0;
Packit 971217
  int i;
Packit 971217
Packit 971217
  src->base.base.context = context;
Packit 971217
Packit 971217
  coord = g_new0 (struct XYZWRGB, N_QUADS * 4);
Packit 971217
  plane_indices = g_new0 (gushort, N_QUADS * 6);
Packit 971217
Packit 971217
  /* top row */
Packit 971217
  for (i = 0; i < 7; i++) {
Packit 971217
    coord[color_idx * 4 + 0].X = -1.0f + i * (2.0f / 7.0f);
Packit 971217
    coord[color_idx * 4 + 0].Y = 1.0f / 3.0f;
Packit 971217
    coord[color_idx * 4 + 1].X = -1.0f + (i + 1) * (2.0f / 7.0f);
Packit 971217
    coord[color_idx * 4 + 1].Y = 1.0f / 3.0f;
Packit 971217
    coord[color_idx * 4 + 2].X = -1.0f + (i + 1) * (2.0f / 7.0f);
Packit 971217
    coord[color_idx * 4 + 2].Y = -1.0f;
Packit 971217
    coord[color_idx * 4 + 3].X = -1.0f + i * (2.0f / 7.0f);
Packit 971217
    coord[color_idx * 4 + 3].Y = -1.0f;
Packit 971217
    color_idx++;
Packit 971217
  }
Packit 971217
Packit 971217
  /* middle row */
Packit 971217
  for (i = 0; i < 7; i++) {
Packit 971217
    coord[color_idx * 4 + 0].X = -1.0f + i * (2.0f / 7.0f);
Packit 971217
    coord[color_idx * 4 + 0].Y = 0.5f;
Packit 971217
    coord[color_idx * 4 + 1].X = -1.0f + (i + 1) * (2.0f / 7.0f);
Packit 971217
    coord[color_idx * 4 + 1].Y = 0.5f;
Packit 971217
    coord[color_idx * 4 + 2].X = -1.0f + (i + 1) * (2.0f / 7.0f);
Packit 971217
    coord[color_idx * 4 + 2].Y = 1.0f / 3.0f;
Packit 971217
    coord[color_idx * 4 + 3].X = -1.0f + i * (2.0f / 7.0f);
Packit 971217
    coord[color_idx * 4 + 3].Y = 1.0f / 3.0f;
Packit 971217
    color_idx++;
Packit 971217
  }
Packit 971217
Packit 971217
  /* bottom row, left three */
Packit 971217
  for (i = 0; i < 3; i++) {
Packit 971217
    coord[color_idx * 4 + 0].X = -1.0f + i / 3.0f;
Packit 971217
    coord[color_idx * 4 + 0].Y = 1.0f;
Packit 971217
    coord[color_idx * 4 + 1].X = -1.0f + (i + 1) / 3.0f;
Packit 971217
    coord[color_idx * 4 + 1].Y = 1.0f;
Packit 971217
    coord[color_idx * 4 + 2].X = -1.0f + (i + 1) / 3.0f;
Packit 971217
    coord[color_idx * 4 + 2].Y = 0.5f;
Packit 971217
    coord[color_idx * 4 + 3].X = -1.0f + i / 3.0f;
Packit 971217
    coord[color_idx * 4 + 3].Y = 0.5f;
Packit 971217
    color_idx++;
Packit 971217
  }
Packit 971217
Packit 971217
  /* bottom row, middle three (the blacks) */
Packit 971217
  for (i = 0; i < 3; i++) {
Packit 971217
    coord[color_idx * 4 + 0].X = i / 6.0f;
Packit 971217
    coord[color_idx * 4 + 0].Y = 1.0f;
Packit 971217
    coord[color_idx * 4 + 1].X = (i + 1) / 6.0f;
Packit 971217
    coord[color_idx * 4 + 1].Y = 1.0f;
Packit 971217
    coord[color_idx * 4 + 2].X = (i + 1) / 6.0f;
Packit 971217
    coord[color_idx * 4 + 2].Y = 0.5f;
Packit 971217
    coord[color_idx * 4 + 3].X = i / 6.0f;
Packit 971217
    coord[color_idx * 4 + 3].Y = 0.5f;
Packit 971217
    color_idx++;
Packit 971217
  }
Packit 971217
Packit 971217
  g_assert (color_idx < N_QUADS);
Packit 971217
Packit 971217
  for (i = 0; i < N_QUADS - 1; i++) {
Packit 971217
    int j, k;
Packit 971217
    if (i < 7) {
Packit 971217
      k = i;
Packit 971217
    } else if ((i - 7) & 1) {
Packit 971217
      k = COLOR_BLACK;
Packit 971217
    } else {
Packit 971217
      k = 13 - i;
Packit 971217
    }
Packit 971217
Packit 971217
    if (i == 14) {
Packit 971217
      k = COLOR_NEG_I;
Packit 971217
    } else if (i == 15) {
Packit 971217
      k = COLOR_WHITE;
Packit 971217
    } else if (i == 16) {
Packit 971217
      k = COLOR_POS_Q;
Packit 971217
    } else if (i == 17) {
Packit 971217
      k = COLOR_SUPER_BLACK;
Packit 971217
    } else if (i == 18) {
Packit 971217
      k = COLOR_BLACK;
Packit 971217
    } else if (i == 19) {
Packit 971217
      k = COLOR_DARK_GREY;
Packit 971217
    }
Packit 971217
Packit 971217
    for (j = 0; j < 4; j++) {
Packit 971217
      coord[i * 4 + j].Z = 0.0f;
Packit 971217
      coord[i * 4 + j].W = 1.0f;
Packit 971217
      coord[i * 4 + j].R = vts_colors[k].R;
Packit 971217
      coord[i * 4 + j].G = vts_colors[k].G;
Packit 971217
      coord[i * 4 + j].B = vts_colors[k].B;
Packit 971217
    }
Packit 971217
Packit 971217
    for (j = 0; j < 6; j++)
Packit 971217
      plane_indices[i * 6 + j] = i * 4 + indices_quad[j];
Packit 971217
  }
Packit 971217
Packit 971217
  /* snow */
Packit 971217
  coord[color_idx * 4 + 0].X = 0.5f;
Packit 971217
  coord[color_idx * 4 + 0].Y = 1.0f;
Packit 971217
  coord[color_idx * 4 + 0].Z = 0.0f;
Packit 971217
  coord[color_idx * 4 + 0].W = 1.0f;
Packit 971217
  coord[color_idx * 4 + 1].X = 1.0f;
Packit 971217
  coord[color_idx * 4 + 1].Y = 1.0f;
Packit 971217
  coord[color_idx * 4 + 1].Z = 0.0f;
Packit 971217
  coord[color_idx * 4 + 1].W = 1.0f;
Packit 971217
  coord[color_idx * 4 + 2].X = 1.0f;
Packit 971217
  coord[color_idx * 4 + 2].Y = 0.5f;
Packit 971217
  coord[color_idx * 4 + 2].Z = 0.0f;
Packit 971217
  coord[color_idx * 4 + 2].W = 1.0f;
Packit 971217
  coord[color_idx * 4 + 3].X = 0.5f;
Packit 971217
  coord[color_idx * 4 + 3].Y = 0.5f;
Packit 971217
  coord[color_idx * 4 + 3].Z = 0.0f;
Packit 971217
  coord[color_idx * 4 + 3].W = 1.0f;
Packit 971217
  for (i = 0; i < 6; i++)
Packit 971217
    plane_indices[color_idx * 6 + i] = color_idx * 4 + indices_quad[i];
Packit 971217
  color_idx++;
Packit 971217
Packit 971217
  if (src->color_shader)
Packit 971217
    gst_object_unref (src->color_shader);
Packit 971217
  src->color_shader = gst_gl_shader_new_link_with_stages (context, &error,
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          smpte_vertex_src),
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          smpte_fragment_src), NULL);
Packit 971217
  if (!src->color_shader) {
Packit 971217
    GST_ERROR_OBJECT (src->base.base.src, "%s", error->message);
Packit 971217
    return FALSE;
Packit 971217
  }
Packit 971217
Packit 971217
  if (src->snow_shader)
Packit 971217
    gst_object_unref (src->snow_shader);
Packit 971217
  src->snow_shader = gst_gl_shader_new_link_with_stages (context, &error,
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          snow_vertex_src),
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          snow_fragment_src), NULL);
Packit 971217
  if (!src->snow_shader) {
Packit 971217
    GST_ERROR_OBJECT (src->base.base.src, "%s", error->message);
Packit 971217
    return FALSE;
Packit 971217
  }
Packit 971217
Packit 971217
  src->attr_snow_position = -1;
Packit 971217
Packit 971217
  src->base.n_attributes = 2;
Packit 971217
Packit 971217
  src->base.attributes[0].name = "position";
Packit 971217
  src->base.attributes[0].location = -1;
Packit 971217
  src->base.attributes[0].n_elements = 4;
Packit 971217
  src->base.attributes[0].element_type = GL_FLOAT;
Packit 971217
  src->base.attributes[0].offset = 0;
Packit 971217
  src->base.attributes[0].stride = sizeof (struct XYZWRGB);
Packit 971217
Packit 971217
  src->base.attributes[1].name = "a_color";
Packit 971217
  src->base.attributes[1].location = -1;
Packit 971217
  src->base.attributes[1].n_elements = 3;
Packit 971217
  src->base.attributes[1].element_type = GL_FLOAT;
Packit 971217
  src->base.attributes[1].offset = 4 * sizeof (gfloat);
Packit 971217
  src->base.attributes[1].stride = sizeof (struct XYZWRGB);
Packit 971217
Packit 971217
  if (src->base.shader)
Packit 971217
    gst_object_unref (src->base.shader);
Packit 971217
  src->base.shader = gst_object_ref (src->color_shader);
Packit 971217
  src->base.vertices = (gfloat *) coord;
Packit 971217
  src->base.vertices_size = sizeof (struct XYZWRGB) * N_QUADS * 4;
Packit 971217
  src->base.indices = plane_indices;
Packit 971217
  src->base.n_indices = N_QUADS * 6;
Packit 971217
Packit 971217
  return _src_shader_init (impl, context, v_info);
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_smpte_fill_bound_fbo (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcSMPTE *src = impl;
Packit 971217
  gint attr_color_position = -1;
Packit 971217
Packit 971217
  src->base.n_attributes = 2;
Packit 971217
  if (src->base.shader)
Packit 971217
    gst_object_unref (src->base.shader);
Packit 971217
  src->base.shader = gst_object_ref (src->color_shader);
Packit 971217
  src->base.n_indices = (N_QUADS - 1) * 6;
Packit 971217
  src->base.index_offset = 0;
Packit 971217
  if (!_src_shader_fill_bound_fbo (impl))
Packit 971217
    return FALSE;
Packit 971217
  attr_color_position = src->base.attributes[0].location;
Packit 971217
Packit 971217
  src->base.attributes[0].location = src->attr_snow_position;
Packit 971217
  src->base.n_attributes = 1;
Packit 971217
  if (src->base.shader)
Packit 971217
    gst_object_unref (src->base.shader);
Packit 971217
  src->base.shader = gst_object_ref (src->snow_shader);
Packit 971217
  src->base.n_indices = 6;
Packit 971217
  src->base.index_offset = (N_QUADS - 1) * 6 * sizeof (gushort);
Packit 971217
  gst_gl_shader_use (src->snow_shader);
Packit 971217
  gst_gl_shader_set_uniform_1f (src->snow_shader, "time",
Packit 971217
      (gfloat) src->base.base.src->running_time / GST_SECOND);
Packit 971217
  if (!_src_shader_fill_bound_fbo (impl))
Packit 971217
    return FALSE;
Packit 971217
  src->attr_snow_position = src->base.attributes[0].location;
Packit 971217
  src->base.attributes[0].location = attr_color_position;
Packit 971217
Packit 971217
  return TRUE;
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
_src_smpte_free (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcSMPTE *src = impl;
Packit 971217
Packit 971217
  if (!impl)
Packit 971217
    return;
Packit 971217
Packit 971217
  _src_shader_deinit (impl);
Packit 971217
Packit 971217
  g_free ((gpointer) src->base.vertices);
Packit 971217
  g_free ((gpointer) src->base.indices);
Packit 971217
Packit 971217
  if (src->snow_shader)
Packit 971217
    gst_object_unref (src->snow_shader);
Packit 971217
  if (src->color_shader)
Packit 971217
    gst_object_unref (src->color_shader);
Packit 971217
Packit 971217
  g_free (impl);
Packit 971217
}
Packit 971217
Packit 971217
static const struct SrcFuncs src_smpte = {
Packit 971217
  GST_GL_TEST_SRC_SMPTE,
Packit 971217
  _src_smpte_new,
Packit 971217
  _src_smpte_init,
Packit 971217
  _src_smpte_fill_bound_fbo,
Packit 971217
  _src_smpte_free,
Packit 971217
};
Packit 971217
Packit 971217
#undef N_QUADS
Packit 971217
Packit 971217
struct SrcUniColor
Packit 971217
{
Packit 971217
  struct BaseSrcImpl base;
Packit 971217
Packit 971217
  struct vts_color_struct color;
Packit 971217
};
Packit 971217
Packit 971217
static gpointer
Packit 971217
_src_uni_color_new (GstGLTestSrc * test)
Packit 971217
{
Packit 971217
  struct SrcUniColor *src = g_new0 (struct SrcUniColor, 1);
Packit 971217
Packit 971217
  src->base.src = test;
Packit 971217
Packit 971217
  return src;
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_uni_color_init (gpointer impl, GstGLContext * context,
Packit 971217
    GstVideoInfo * v_info)
Packit 971217
{
Packit 971217
  struct SrcUniColor *src = impl;
Packit 971217
Packit 971217
  src->base.context = context;
Packit 971217
  src->base.v_info = *v_info;
Packit 971217
Packit 971217
  return TRUE;
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_uni_color_fill_bound_fbo (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcUniColor *src = impl;
Packit 971217
  const GstGLFuncs *gl = src->base.context->gl_vtable;
Packit 971217
Packit 971217
  gl->ClearColor (src->color.R, src->color.G, src->color.B, 1.0f);
Packit 971217
  gl->Clear (GL_COLOR_BUFFER_BIT);
Packit 971217
Packit 971217
  return TRUE;
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
_src_uni_color_free (gpointer impl)
Packit 971217
{
Packit 971217
  g_free (impl);
Packit 971217
}
Packit 971217
Packit 971217
#define SRC_UNICOLOR(name, cap_name) \
Packit 971217
static gpointer \
Packit 971217
G_PASTE(G_PASTE(_src_unicolor_,name),_new) (GstGLTestSrc * test) \
Packit 971217
{ \
Packit 971217
  struct SrcUniColor *src = _src_uni_color_new (test); \
Packit 971217
  src->color = vts_colors[G_PASTE(COLOR_,cap_name)]; \
Packit 971217
  return src; \
Packit 971217
} \
Packit 971217
static const struct SrcFuncs G_PASTE (src_,name) = { \
Packit 971217
  G_PASTE(GST_GL_TEST_SRC_,cap_name), \
Packit 971217
  G_PASTE(G_PASTE(_src_unicolor_,name),_new), \
Packit 971217
  _src_uni_color_init, \
Packit 971217
  _src_uni_color_fill_bound_fbo, \
Packit 971217
  _src_uni_color_free, \
Packit 971217
}
Packit 971217
Packit 971217
SRC_UNICOLOR (white, WHITE);
Packit 971217
SRC_UNICOLOR (black, BLACK);
Packit 971217
SRC_UNICOLOR (red, RED);
Packit 971217
SRC_UNICOLOR (green, GREEN);
Packit 971217
SRC_UNICOLOR (blue, BLUE);
Packit 971217
Packit 971217
static gpointer
Packit 971217
_src_blink_new (GstGLTestSrc * test)
Packit 971217
{
Packit 971217
  struct SrcUniColor *src = _src_uni_color_new (test);
Packit 971217
Packit 971217
  src->color = vts_colors[COLOR_WHITE];
Packit 971217
Packit 971217
  return src;
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_blink_fill_bound_fbo (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcUniColor *src = impl;
Packit 971217
Packit 971217
  if (src->color.R > 0.5) {
Packit 971217
    src->color = vts_colors[COLOR_BLACK];
Packit 971217
  } else {
Packit 971217
    src->color = vts_colors[COLOR_WHITE];
Packit 971217
  }
Packit 971217
Packit 971217
  return _src_uni_color_fill_bound_fbo (impl);
Packit 971217
}
Packit 971217
Packit 971217
static const struct SrcFuncs src_blink = {
Packit 971217
  GST_GL_TEST_SRC_BLINK,
Packit 971217
  _src_blink_new,
Packit 971217
  _src_uni_color_init,
Packit 971217
  _src_blink_fill_bound_fbo,
Packit 971217
  _src_uni_color_free,
Packit 971217
};
Packit 971217
Packit 971217
/* *INDENT-OFF* */
Packit 971217
static const gchar *checkers_vertex_src = "attribute vec4 position;\n"
Packit 971217
    "varying vec2 uv;\n"
Packit 971217
    "void main()\n"
Packit 971217
    "{\n"
Packit 971217
    "  gl_Position = position;\n"
Packit 971217
    /* RPi gives incorrect results for positive uv (plus it makes us start on
Packit 971217
     * the right pixel color i.e. red) */
Packit 971217
    "  uv = position.xy - 1.0;\n"
Packit 971217
    "}";
Packit 971217
Packit 971217
static const gchar *checkers_fragment_src =
Packit 971217
    "#ifdef GL_ES\n"
Packit 971217
    "precision mediump float;\n"
Packit 971217
    "#endif\n"
Packit 971217
    "uniform float checker_width;\n"
Packit 971217
    "uniform float width;\n"
Packit 971217
    "uniform float height;\n"
Packit 971217
    "varying vec2 uv;\n"
Packit 971217
    "void main()\n"
Packit 971217
    "{\n"
Packit 971217
    "  vec2 xy_mod = floor (0.5 * uv * vec2(width, height) / (checker_width));\n"
Packit 971217
    "  float result = mod (xy_mod.x + xy_mod.y, 2.0);\n"
Packit 971217
    "  gl_FragColor.r = step (result, 0.5);\n"
Packit 971217
    "  gl_FragColor.g = 1.0 - gl_FragColor.r;\n"
Packit 971217
    "  gl_FragColor.ba = vec2(0.0, 1.0);\n"
Packit 971217
    "}";
Packit 971217
/* *INDENT-ON* */
Packit 971217
Packit 971217
struct SrcCheckers
Packit 971217
{
Packit 971217
  struct SrcShader base;
Packit 971217
Packit 971217
  guint checker_width;
Packit 971217
};
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_checkers_init (gpointer impl, GstGLContext * context,
Packit 971217
    GstVideoInfo * v_info)
Packit 971217
{
Packit 971217
  struct SrcCheckers *src = impl;
Packit 971217
  GError *error = NULL;
Packit 971217
Packit 971217
  src->base.base.context = context;
Packit 971217
Packit 971217
  if (src->base.shader)
Packit 971217
    gst_object_unref (src->base.shader);
Packit 971217
  src->base.shader = gst_gl_shader_new_link_with_stages (context, &error,
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          checkers_vertex_src),
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          checkers_fragment_src), NULL);
Packit 971217
  if (!src->base.shader) {
Packit 971217
    GST_ERROR_OBJECT (src->base.base.src, "%s", error->message);
Packit 971217
    return FALSE;
Packit 971217
  }
Packit 971217
Packit 971217
  src->base.n_attributes = 1;
Packit 971217
Packit 971217
  src->base.attributes[0].name = "position";
Packit 971217
  src->base.attributes[0].location = -1;
Packit 971217
  src->base.attributes[0].n_elements = 4;
Packit 971217
  src->base.attributes[0].element_type = GL_FLOAT;
Packit 971217
  src->base.attributes[0].offset = 0;
Packit 971217
  src->base.attributes[0].stride = 4 * sizeof (gfloat);
Packit 971217
Packit 971217
  src->base.vertices = positions;
Packit 971217
  src->base.vertices_size = sizeof (positions);
Packit 971217
  src->base.indices = indices_quad;
Packit 971217
  src->base.n_indices = 6;
Packit 971217
Packit 971217
  gst_gl_shader_use (src->base.shader);
Packit 971217
  gst_gl_shader_set_uniform_1f (src->base.shader, "checker_width",
Packit 971217
      src->checker_width);
Packit 971217
  gst_gl_shader_set_uniform_1f (src->base.shader, "width",
Packit 971217
      (gfloat) GST_VIDEO_INFO_WIDTH (v_info));
Packit 971217
  gst_gl_shader_set_uniform_1f (src->base.shader, "height",
Packit 971217
      (gfloat) GST_VIDEO_INFO_HEIGHT (v_info));
Packit 971217
  gst_gl_context_clear_shader (src->base.base.context);
Packit 971217
Packit 971217
  return _src_shader_init (impl, context, v_info);
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
_src_checkers_free (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcCheckers *src = impl;
Packit 971217
Packit 971217
  if (!src)
Packit 971217
    return;
Packit 971217
Packit 971217
  _src_shader_deinit (impl);
Packit 971217
Packit 971217
  g_free (impl);
Packit 971217
}
Packit 971217
Packit 971217
static gpointer
Packit 971217
_src_checkers_new (GstGLTestSrc * test)
Packit 971217
{
Packit 971217
  struct SrcCheckers *src = g_new0 (struct SrcCheckers, 1);
Packit 971217
Packit 971217
  src->base.base.src = test;
Packit 971217
Packit 971217
  return src;
Packit 971217
}
Packit 971217
Packit 971217
#define SRC_CHECKERS(spacing) \
Packit 971217
static gpointer \
Packit 971217
G_PASTE(G_PASTE(_src_checkers,spacing),_new) (GstGLTestSrc * test) \
Packit 971217
{ \
Packit 971217
  struct SrcCheckers *src = _src_checkers_new (test); \
Packit 971217
  src->checker_width = spacing; \
Packit 971217
  return src; \
Packit 971217
} \
Packit 971217
static const struct SrcFuncs G_PASTE(src_checkers,spacing) = { \
Packit 971217
  G_PASTE(GST_GL_TEST_SRC_CHECKERS,spacing), \
Packit 971217
  G_PASTE(G_PASTE(_src_checkers,spacing),_new), \
Packit 971217
  _src_checkers_init, \
Packit 971217
  _src_shader_fill_bound_fbo, \
Packit 971217
  _src_checkers_free, \
Packit 971217
}
Packit 971217
Packit 971217
SRC_CHECKERS (1);
Packit 971217
SRC_CHECKERS (2);
Packit 971217
SRC_CHECKERS (4);
Packit 971217
SRC_CHECKERS (8);
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_snow_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
  GError *error = NULL;
Packit 971217
Packit 971217
  src->base.context = context;
Packit 971217
Packit 971217
  if (src->shader)
Packit 971217
    gst_object_unref (src->shader);
Packit 971217
  src->shader = gst_gl_shader_new_link_with_stages (context, &error,
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          snow_vertex_src),
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          snow_fragment_src), NULL);
Packit 971217
  if (!src->shader) {
Packit 971217
    GST_ERROR_OBJECT (src->base.src, "%s", error->message);
Packit 971217
    return FALSE;
Packit 971217
  }
Packit 971217
Packit 971217
  src->n_attributes = 1;
Packit 971217
Packit 971217
  src->attributes[0].name = "position";
Packit 971217
  src->attributes[0].location = -1;
Packit 971217
  src->attributes[0].n_elements = 4;
Packit 971217
  src->attributes[0].element_type = GL_FLOAT;
Packit 971217
  src->attributes[0].offset = 0;
Packit 971217
  src->attributes[0].stride = 4 * sizeof (gfloat);
Packit 971217
Packit 971217
  src->vertices = positions;
Packit 971217
  src->vertices_size = sizeof (positions);
Packit 971217
  src->indices = indices_quad;
Packit 971217
  src->n_indices = 6;
Packit 971217
Packit 971217
  return _src_shader_init (impl, context, v_info);
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_snow_fill_bound_fbo (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
Packit 971217
  g_return_val_if_fail (src->base.context, FALSE);
Packit 971217
  g_return_val_if_fail (src->shader, FALSE);
Packit 971217
Packit 971217
  gst_gl_shader_use (src->shader);
Packit 971217
  gst_gl_shader_set_uniform_1f (src->shader, "time",
Packit 971217
      (gfloat) src->base.src->running_time / GST_SECOND);
Packit 971217
Packit 971217
  return _src_shader_fill_bound_fbo (impl);
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
_src_snow_free (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
Packit 971217
  if (!src)
Packit 971217
    return;
Packit 971217
Packit 971217
  _src_shader_deinit (impl);
Packit 971217
Packit 971217
  g_free (impl);
Packit 971217
}
Packit 971217
Packit 971217
static gpointer
Packit 971217
_src_snow_new (GstGLTestSrc * test)
Packit 971217
{
Packit 971217
  struct SrcShader *src = g_new0 (struct SrcShader, 1);
Packit 971217
Packit 971217
  src->base.src = test;
Packit 971217
Packit 971217
  return src;
Packit 971217
}
Packit 971217
Packit 971217
static const struct SrcFuncs src_snow = {
Packit 971217
  GST_GL_TEST_SRC_SNOW,
Packit 971217
  _src_snow_new,
Packit 971217
  _src_snow_init,
Packit 971217
  _src_snow_fill_bound_fbo,
Packit 971217
  _src_snow_free,
Packit 971217
};
Packit 971217
Packit 971217
/* *INDENT-OFF* */
Packit 971217
static const gchar *mandelbrot_vertex_src = "attribute vec4 position;\n"
Packit 971217
    "uniform float aspect_ratio;\n"
Packit 971217
    "varying vec2 fractal_position;\n"
Packit 971217
    "void main()\n"
Packit 971217
    "{\n"
Packit 971217
    "  gl_Position = position;\n"
Packit 971217
    "  fractal_position = vec2(position.y * 0.5 - 0.3, aspect_ratio * position.x * 0.5);\n"
Packit 971217
    "  fractal_position *= 2.5;\n"
Packit 971217
    "}";
Packit 971217
Packit 971217
static const gchar *mandelbrot_fragment_src = 
Packit 971217
    "#ifdef GL_ES\n"
Packit 971217
    "precision mediump float;\n"
Packit 971217
    "#endif\n"
Packit 971217
    "uniform float time;\n"
Packit 971217
    "varying vec2 fractal_position;\n"
Packit 971217
    "const vec4 K = vec4(1.0, 0.66, 0.33, 3.0);\n"
Packit 971217
    "vec4 hsv_to_rgb(float hue, float saturation, float value) {\n"
Packit 971217
    "  vec4 p = abs(fract(vec4(hue) + K) * 6.0 - K.wwww);\n"
Packit 971217
    "  return value * mix(K.xxxx, clamp(p - K.xxxx, 0.0, 1.0), saturation);\n"
Packit 971217
    "}\n"
Packit 971217
    "vec4 i_to_rgb(int i) {\n"
Packit 971217
    "  float hue = float(i) / 100.0 + sin(time);\n"
Packit 971217
    "  return hsv_to_rgb(hue, 0.5, 0.8);\n"
Packit 971217
    "}\n"
Packit 971217
    "vec2 pow_2_complex(vec2 c) {\n"
Packit 971217
    "  return vec2(c.x*c.x - c.y*c.y, 2.0 * c.x * c.y);\n"
Packit 971217
    "}\n"
Packit 971217
    "vec2 mandelbrot(vec2 c, vec2 c0) {\n"
Packit 971217
    "  return pow_2_complex(c) + c0;\n"
Packit 971217
    "}\n"
Packit 971217
    "vec4 iterate_pixel(vec2 position) {\n"
Packit 971217
    "  vec2 c = vec2(0);\n"
Packit 971217
    "  for (int i=0; i < 20; i++) {\n"
Packit 971217
    "    if (c.x*c.x + c.y*c.y > 2.0*2.0)\n"
Packit 971217
    "      return i_to_rgb(i);\n"
Packit 971217
    "    c = mandelbrot(c, position);\n"
Packit 971217
    "  }\n"
Packit 971217
    "  return vec4(0, 0, 0, 1);\n"
Packit 971217
    "}\n"
Packit 971217
    "void main() {\n"
Packit 971217
    "  gl_FragColor = iterate_pixel(fractal_position);\n"
Packit 971217
    "}";
Packit 971217
/* *INDENT-ON* */
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_mandelbrot_init (gpointer impl, GstGLContext * context,
Packit 971217
    GstVideoInfo * v_info)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
  GError *error = NULL;
Packit 971217
Packit 971217
  src->base.context = context;
Packit 971217
Packit 971217
  if (src->shader)
Packit 971217
    gst_object_unref (src->shader);
Packit 971217
  src->shader = gst_gl_shader_new_link_with_stages (context, &error,
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          mandelbrot_vertex_src),
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          mandelbrot_fragment_src), NULL);
Packit 971217
  if (!src->shader) {
Packit 971217
    GST_ERROR_OBJECT (src->base.src, "%s", error->message);
Packit 971217
    return FALSE;
Packit 971217
  }
Packit 971217
Packit 971217
  src->n_attributes = 1;
Packit 971217
Packit 971217
  src->attributes[0].name = "position";
Packit 971217
  src->attributes[0].location = -1;
Packit 971217
  src->attributes[0].n_elements = 4;
Packit 971217
  src->attributes[0].element_type = GL_FLOAT;
Packit 971217
  src->attributes[0].offset = 0;
Packit 971217
  src->attributes[0].stride = 4 * sizeof (gfloat);
Packit 971217
Packit 971217
  src->vertices = positions;
Packit 971217
  src->vertices_size = sizeof (positions);
Packit 971217
  src->indices = indices_quad;
Packit 971217
  src->n_indices = 6;
Packit 971217
Packit 971217
  gst_gl_shader_use (src->shader);
Packit 971217
  gst_gl_shader_set_uniform_1f (src->shader, "aspect_ratio",
Packit 971217
      (gfloat) GST_VIDEO_INFO_WIDTH (v_info) /
Packit 971217
      (gfloat) GST_VIDEO_INFO_HEIGHT (v_info));
Packit 971217
  gst_gl_context_clear_shader (src->base.context);
Packit 971217
Packit 971217
  return _src_shader_init (impl, context, v_info);
Packit 971217
}
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_mandelbrot_fill_bound_fbo (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
Packit 971217
  g_return_val_if_fail (src->base.context, FALSE);
Packit 971217
  g_return_val_if_fail (src->shader, FALSE);
Packit 971217
Packit 971217
  gst_gl_shader_use (src->shader);
Packit 971217
  gst_gl_shader_set_uniform_1f (src->shader, "time",
Packit 971217
      (gfloat) src->base.src->running_time / GST_SECOND);
Packit 971217
Packit 971217
  return _src_shader_fill_bound_fbo (impl);
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
_src_mandelbrot_free (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
Packit 971217
  if (!src)
Packit 971217
    return;
Packit 971217
Packit 971217
  _src_shader_deinit (impl);
Packit 971217
Packit 971217
  g_free (impl);
Packit 971217
}
Packit 971217
Packit 971217
static gpointer
Packit 971217
_src_mandelbrot_new (GstGLTestSrc * test)
Packit 971217
{
Packit 971217
  struct SrcShader *src = g_new0 (struct SrcShader, 1);
Packit 971217
Packit 971217
  src->base.src = test;
Packit 971217
Packit 971217
  return src;
Packit 971217
}
Packit 971217
Packit 971217
static const struct SrcFuncs src_mandelbrot = {
Packit 971217
  GST_GL_TEST_SRC_MANDELBROT,
Packit 971217
  _src_mandelbrot_new,
Packit 971217
  _src_mandelbrot_init,
Packit 971217
  _src_mandelbrot_fill_bound_fbo,
Packit 971217
  _src_mandelbrot_free,
Packit 971217
};
Packit 971217
Packit 971217
/* *INDENT-OFF* */
Packit 971217
static const gchar *circular_vertex_src =
Packit 971217
    "attribute vec4 position;\n"
Packit 971217
    "varying vec2 uv;\n"
Packit 971217
    "void main()\n"
Packit 971217
    "{\n"
Packit 971217
    "  gl_Position = position;\n"
Packit 971217
    "  uv = position.xy;\n"
Packit 971217
    "}";
Packit 971217
Packit 971217
static const gchar *circular_fragment_src =
Packit 971217
    "#ifdef GL_ES\n"
Packit 971217
    "precision mediump float;\n"
Packit 971217
    "#endif\n"
Packit 971217
    "uniform float aspect_ratio;\n"
Packit 971217
    "varying vec2 uv;\n"
Packit 971217
    "#define PI 3.14159265\n"
Packit 971217
    "void main() {\n"
Packit 971217
    "  float dist = 0.5 * sqrt(uv.x * uv.x + uv.y / aspect_ratio * uv.y / aspect_ratio);\n"
Packit 971217
    "  float seg = floor(dist * 16.0);\n"
Packit 971217
    "  if (seg <= 0.0 || seg >= 8.0) {\n"
Packit 971217
    "    gl_FragColor = vec4(vec3(0.0), 1.0);\n"
Packit 971217
    "  } else {\n"
Packit 971217
    "    float d = floor (256.0 * dist * 200.0 * pow (2.0, - (seg - 1.0) / 4.0) + 0.5) / 128.0;\n"
Packit 971217
    "    gl_FragColor = vec4 (vec3(sin (d * PI) * 0.5 + 0.5), 1.0);\n"
Packit 971217
    "  }\n"
Packit 971217
    "}";
Packit 971217
/* *INDENT-ON* */
Packit 971217
Packit 971217
static gboolean
Packit 971217
_src_circular_init (gpointer impl, GstGLContext * context,
Packit 971217
    GstVideoInfo * v_info)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
  GError *error = NULL;
Packit 971217
Packit 971217
  src->base.context = context;
Packit 971217
Packit 971217
  if (src->shader)
Packit 971217
    gst_object_unref (src->shader);
Packit 971217
  src->shader = gst_gl_shader_new_link_with_stages (context, &error,
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          circular_vertex_src),
Packit 971217
      gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
Packit 971217
          GST_GLSL_VERSION_NONE,
Packit 971217
          GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
Packit 971217
          circular_fragment_src), NULL);
Packit 971217
  if (!src->shader) {
Packit 971217
    GST_ERROR_OBJECT (src->base.src, "%s", error->message);
Packit 971217
    return FALSE;
Packit 971217
  }
Packit 971217
Packit 971217
  src->n_attributes = 1;
Packit 971217
Packit 971217
  src->attributes[0].name = "position";
Packit 971217
  src->attributes[0].location = -1;
Packit 971217
  src->attributes[0].n_elements = 4;
Packit 971217
  src->attributes[0].element_type = GL_FLOAT;
Packit 971217
  src->attributes[0].offset = 0;
Packit 971217
  src->attributes[0].stride = 4 * sizeof (gfloat);
Packit 971217
Packit 971217
  src->vertices = positions;
Packit 971217
  src->vertices_size = sizeof (positions);
Packit 971217
  src->indices = indices_quad;
Packit 971217
  src->n_indices = 6;
Packit 971217
Packit 971217
  gst_gl_shader_use (src->shader);
Packit 971217
  gst_gl_shader_set_uniform_1f (src->shader, "aspect_ratio",
Packit 971217
      (gfloat) GST_VIDEO_INFO_WIDTH (v_info) /
Packit 971217
      (gfloat) GST_VIDEO_INFO_HEIGHT (v_info));
Packit 971217
  gst_gl_context_clear_shader (src->base.context);
Packit 971217
Packit 971217
  return _src_shader_init (impl, context, v_info);
Packit 971217
}
Packit 971217
Packit 971217
static void
Packit 971217
_src_circular_free (gpointer impl)
Packit 971217
{
Packit 971217
  struct SrcShader *src = impl;
Packit 971217
Packit 971217
  if (!src)
Packit 971217
    return;
Packit 971217
Packit 971217
  _src_shader_deinit (impl);
Packit 971217
Packit 971217
  g_free (impl);
Packit 971217
}
Packit 971217
Packit 971217
static gpointer
Packit 971217
_src_circular_new (GstGLTestSrc * test)
Packit 971217
{
Packit 971217
  struct SrcShader *src = g_new0 (struct SrcShader, 1);
Packit 971217
Packit 971217
  src->base.src = test;
Packit 971217
Packit 971217
  return src;
Packit 971217
}
Packit 971217
Packit 971217
static const struct SrcFuncs src_circular = {
Packit 971217
  GST_GL_TEST_SRC_CIRCULAR,
Packit 971217
  _src_circular_new,
Packit 971217
  _src_circular_init,
Packit 971217
  _src_mandelbrot_fill_bound_fbo,
Packit 971217
  _src_circular_free,
Packit 971217
};
Packit 971217
Packit 971217
static const struct SrcFuncs *src_impls[] = {
Packit 971217
  &src_smpte,
Packit 971217
  &src_snow,
Packit 971217
  &src_black,
Packit 971217
  &src_white,
Packit 971217
  &src_red,
Packit 971217
  &src_green,
Packit 971217
  &src_blue,
Packit 971217
  &src_checkers1,
Packit 971217
  &src_checkers2,
Packit 971217
  &src_checkers4,
Packit 971217
  &src_checkers8,
Packit 971217
  &src_circular,
Packit 971217
  &src_blink,
Packit 971217
  &src_mandelbrot,
Packit 971217
};
Packit 971217
Packit 971217
const struct SrcFuncs *
Packit 971217
gst_gl_test_src_get_src_funcs_for_pattern (GstGLTestSrcPattern pattern)
Packit 971217
{
Packit 971217
  gint i;
Packit 971217
Packit 971217
  for (i = 0; i < G_N_ELEMENTS (src_impls); i++) {
Packit 971217
    if (src_impls[i]->pattern == pattern)
Packit 971217
      return src_impls[i];
Packit 971217
  }
Packit 971217
Packit 971217
  return NULL;
Packit 971217
}