memory semantics
[vg.git] / vg_loader.h
index f62763d5ca63445115a206cb3fc5d296efefbac0..a776322b8b1ab18b60dcae8113cea53dc382a058 100644 (file)
@@ -12,7 +12,7 @@
 
 #include "common.h"
 
-VG_STATIC void vg_loader_start( void(*pfn)(void) );
+VG_STATIC void vg_loader_start( void(*pfn)(void *data), void *data );
 VG_STATIC void vg_loader_step( void( *fn_load )(void), void( *fn_free )(void) );
 
 static struct vg_shader _shader_loader = 
@@ -20,44 +20,7 @@ static struct vg_shader _shader_loader =
    .name = "[vg] loader",
    .link = NULL,
 
-   /* This is the old background shader */
-#if 0
-   .vs = 
-   {
-      .orig_file = NULL,
-      .static_src = ""
-      "layout (location=0) in vec2 a_co;"
-      "out vec2 aUv;"
-      "void main()"
-      "{"
-         "gl_Position = vec4(a_co*2.0-1.0,0.0,1.0);"
-         "aUv = a_co;"
-      "}"
-   },
-   .fs = 
-   {
-      .orig_file = NULL,
-      .static_src = 
-      
-      "out vec4 FragColor;"
-      "uniform float uTime;"
-      "in vec2 aUv;"
-      
-      "void main()"
-      "{"
-         "float dither=fract(dot(vec2(171.0,231.0),gl_FragCoord.xy)/71.0)-0.5;"
-         "float grad = 1.0-(aUv.y*0.5+0.5)*0.5;"
-         "float fmt1 = step( 0.5, grad+dither );"
-
-         "vec3 col = 0.5+0.5*sin( uTime + aUv.xyx + vec3(0.0,2.0,4.0) );"
-
-         "FragColor = vec4(vec3(0.5,0.5,0.5)*grad*fmt1,1.0);"
-      "}"
-   }
-#else
-
    /* This is the new foreground shader */
-
    .vs = 
    {
       .orig_file = NULL,
@@ -78,6 +41,7 @@ static struct vg_shader _shader_loader =
       "out vec4 FragColor;"
       "uniform float uTime;"
       "uniform float uRatio;"
+      "uniform float uOpacity;"
       "in vec2 aUv;"
 
       "float eval_zero( vec2 uv )"
@@ -95,7 +59,6 @@ static struct vg_shader _shader_loader =
       
       "void main()"
       "{"
-
          "vec3 col = 0.5+0.5*sin( uTime + aUv.xyx + vec3(0.0,2.0,4.0) );"
          
          "vec2 uvx = aUv - vec2( 0.5 );"
@@ -107,18 +70,15 @@ static struct vg_shader _shader_loader =
          "float dither=fract(dot(vec2(171.0,231.0),gl_FragCoord.xy)/71.0)-0.5;"
          "float fmt1 = step( 0.5, zero*zero + dither )*0.8+0.2;"
 
-         "FragColor = vec4(vec3(fmt1),0.8);"
+         "FragColor = vec4(vec3(fmt1),uOpacity);"
       "}"
    }
-
-#endif
 };
 
 static struct vg_loader
 {
    /* Shutdown steps */
-   struct loader_free_step
-   {
+   struct loader_free_step{
       void (*fn_free)(void);
    }
    step_buffer[16];
@@ -162,12 +122,11 @@ VG_STATIC void _vg_loader_free(void)
       vg_info( " -> %p\n", step->fn_free );
       step->fn_free();
    }
-
-   vg_info( "done\n" );
 }
 
 VG_STATIC void _vg_render_log(void)
 {
+#if 0
    ui_begin( vg.window_x, vg.window_y );
    SDL_AtomicLock( &log_print_sl );
 
@@ -197,25 +156,11 @@ VG_STATIC void _vg_render_log(void)
 
    ui_resolve();
    ui_draw( NULL );
+#endif
 }
 
-VG_STATIC void _vg_loader_render(void)
+VG_STATIC void _vg_loader_render_ring( float opacity )
 {
-   glViewport( 0,0, vg.window_x, vg.window_y );
-   glBindFramebuffer( GL_FRAMEBUFFER, 0 );
-   glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
-   glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
-
-#if 0
-   glUseProgram( _shader_loader.id );
-       glUniform1f( glGetUniformLocation( _shader_loader.id, "uTime" ), vg.time );
-   glBindVertexArray( vg_loader.vao );
-   glDrawArrays( GL_TRIANGLES, 0, 6 );
-#endif
-
-   _vg_render_log();
-
-#if 1
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBlendEquation(GL_FUNC_ADD);
@@ -224,23 +169,34 @@ VG_STATIC void _vg_loader_render(void)
        glUniform1f( glGetUniformLocation( _shader_loader.id, "uTime" ), vg.time );
    float ratio = (float)vg.window_x / (float)vg.window_y;
    glUniform1f( glGetUniformLocation( _shader_loader.id, "uRatio"), ratio );
+   glUniform1f( glGetUniformLocation( _shader_loader.id, "uOpacity"), opacity );
    glBindVertexArray( vg_loader.vao );
    glDrawArrays( GL_TRIANGLES, 0, 6 );
-#endif
+}
+
+VG_STATIC void _vg_loader_render(void)
+{
+   glViewport( 0,0, vg.window_x, vg.window_y );
+   glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+   glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
+   glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
+
+   _vg_render_log();
+   vg.loader_ring = 0.8f;
 }
 
 
 VG_STATIC void vg_load_full(void);
 
-VG_STATIC int _vg_loader_thread(void *pfn)
+VG_STATIC int _vg_loader_thread( void *pfn )
 {
    if( setjmp( vg.env_loader_exit ) )
       return 0;
 
    /* Run client loader */
    vg_info( "Starting client loader thread @%p\n", pfn );
-   void (*call_func)(void) = pfn;
-   call_func();
+   void (*call_func)(void *data) = pfn;
+   call_func( vg.thread_data );
 
    SDL_SemPost( vg.sem_loader );
    vg.thread_id_loader = 0;
@@ -248,9 +204,11 @@ VG_STATIC int _vg_loader_thread(void *pfn)
    return 0;
 }
 
-VG_STATIC void vg_loader_start( void(*pfn)(void) )
+VG_STATIC void vg_loader_start( void(*pfn)(void *data), void *data )
 {
    SDL_SemWait( vg.sem_loader );
+
+   vg.thread_data = data;
    SDL_CreateThread( _vg_loader_thread, "Loader thread", pfn );
 }