]> O.S.I.I.S - jp/vkvg.git/commitdiff
devel
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Tue, 17 Apr 2018 14:36:20 +0000 (16:36 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Tue, 17 Apr 2018 14:36:20 +0000 (16:36 +0200)
22 files changed:
CMakeLists.txt
include/vkvg.h
shaders/deferred.frag [deleted file]
shaders/deferred.vert [deleted file]
shaders/paint.frag [deleted file]
shaders/triangle.frag [deleted file]
shaders/triangle.vert [deleted file]
shaders/vkvg_main.frag [new file with mode: 0644]
shaders/vkvg_main.vert [new file with mode: 0644]
src/shaders.h
src/vkvg_context.c
src/vkvg_context_internal.c
src/vkvg_device.c
src/vkvg_device_internal.c
src/vkvg_device_internal.h
src/vkvg_fonts.c
src/vkvg_pattern.c
src/vkvg_pattern.h
src/vkvg_surface.c
tests/test1.c
tests/vke.h
vkh

index c058b5165da493e30885a0d0e668a07c616230f2..54886979b6702d823ff35b5e557e57c8a4a31cdb 100644 (file)
@@ -92,7 +92,6 @@ ADD_LIBRARY(${PROJECT_NAME} SHARED ${VKVG_SRC} ${SHADERS})
 if (BuildShaderHeader)
        add_dependencies(${PROJECT_NAME} BuildShaderHeader)
 endif ()
-#add_dependencies(BuildShaderHeader CompileShaders)
 
 SET_TARGET_PROPERTIES(vkvg PROPERTIES
        VERSION ${PROJECT_VERSION}
@@ -104,6 +103,7 @@ TARGET_INCLUDE_DIRECTORIES(vkvg PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/include
        ${CMAKE_CURRENT_SOURCE_DIR}/src
        ${CMAKE_CURRENT_SOURCE_DIR}/vkh/include
+       ${CMAKE_CURRENT_SOURCE_DIR}/vkh/src
        ${FREETYPE_INCLUDE_DIRS}
        ${HARFBUZZ_INCLUDE_DIRS}
        ${FONTCONFIG_INCLUDE_DIR}
@@ -111,7 +111,6 @@ TARGET_INCLUDE_DIRECTORIES(vkvg PRIVATE
 
 TARGET_LINK_LIBRARIES(${PROJECT_NAME}
        ${Vulkan_LIBRARY}
-       #${GLFW3_LIBRARY}
        ${FREETYPE_LIBRARY}
        ${HARFBUZZ_LIBRARIES}
        ${FONTCONFIG_LIBRARIES}
@@ -131,6 +130,7 @@ if (GLFW3_FOUND)
                ${CMAKE_CURRENT_SOURCE_DIR}/include
                ${CMAKE_CURRENT_SOURCE_DIR}/src
                ${CMAKE_CURRENT_SOURCE_DIR}/vkh/include
+               ${CMAKE_CURRENT_SOURCE_DIR}/vkh/src
        )
        TARGET_LINK_LIBRARIES(${PROJECT_NAME}_test
                ${Vulkan_LIBRARY}
index 0092defe5b2795d680fe8db4f26ef76469a2eea7..9f13281bc604c3ac629f33f4884d9e4946e187d2 100644 (file)
@@ -1,6 +1,10 @@
 #ifndef VKVG_H
 #define VKVG_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include <vulkan/vulkan.h>
 #include <math.h>
 
@@ -18,6 +22,29 @@ typedef enum _vkvg_format {
     VKVG_FORMAT_A1
 } vkvg_format_t;
 
+typedef enum _vkvg_extend {
+    VKVG_EXTEND_NONE,
+    VKVG_EXTEND_REPEAT,
+    VKVG_EXTEND_REFLECT,
+    VKVG_EXTEND_PAD
+} vkvg_extend_t;
+
+typedef enum _vkvg_pattern_type {
+    VKVG_PATTERN_TYPE_SOLID,
+    VKVG_PATTERN_TYPE_SURFACE,
+    VKVG_PATTERN_TYPE_LINEAR,
+    VKVG_PATTERN_TYPE_RADIAL,
+    VKVG_PATTERN_TYPE_MESH,
+    VKVG_PATTERN_TYPE_RASTER_SOURCE,
+} vkvg_pattern_type_t;
+
+typedef struct _vkvg_color_t{
+    float r;
+    float g;
+    float b;
+    float a;
+} vkvg_color_t;
+
 typedef struct _vkvg_context_t* VkvgContext;
 typedef struct _vkvg_surface_t* VkvgSurface;
 typedef struct _vkvg_device_t*  VkvgDevice;
@@ -101,4 +128,8 @@ void vkvg_show_text                 (VkvgContext ctx, const char* text);
 void vkvg_save              (VkvgContext ctx);
 void vkvg_restore           (VkvgContext ctx);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff --git a/shaders/deferred.frag b/shaders/deferred.frag
deleted file mode 100644 (file)
index 895d086..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-#version 450
-
-#extension GL_ARB_separate_shader_objects : enable
-#extension GL_ARB_shading_language_420pack : enable
-
-layout (binding = 1) uniform sampler2DMS samplerPosition;
-layout (binding = 2) uniform sampler2DMS samplerNormal;
-layout (binding = 3) uniform sampler2DMS samplerAlbedo;
-
-layout (location = 0) in vec2 inUV;
-
-layout (location = 0) out vec4 outFragcolor;
-
-struct Light {
-       vec4 position;
-       vec3 color;
-       float radius;
-};
-
-layout (binding = 4) uniform UBO 
-{
-       Light lights[6];
-       vec4 viewPos;
-       ivec2 windowSize;
-} ubo;
-
-layout (constant_id = 0) const int NUM_SAMPLES = 8;
-
-#define NUM_LIGHTS 6
-
-// Manual resolve for MSAA samples 
-vec4 resolve(sampler2DMS tex, ivec2 uv)
-{
-       vec4 result = vec4(0.0);           
-       for (int i = 0; i < NUM_SAMPLES; i++)
-       {
-               vec4 val = texelFetch(tex, uv, i); 
-               result += val;
-       }    
-       // Average resolved samples
-       return result / float(NUM_SAMPLES);
-}
-
-vec3 calculateLighting(vec3 pos, vec3 normal, vec4 albedo)
-{
-       vec3 result = vec3(0.0);
-
-       for(int i = 0; i < NUM_LIGHTS; ++i)
-       {
-               // Vector to light
-               vec3 L = ubo.lights[i].position.xyz - pos;
-               // Distance from light to fragment position
-               float dist = length(L);
-
-               // Viewer to fragment
-               vec3 V = ubo.viewPos.xyz - pos;
-               V = normalize(V);
-               
-               // Light to fragment
-               L = normalize(L);
-
-               // Attenuation
-               float atten = ubo.lights[i].radius / (pow(dist, 2.0) + 1.0);
-
-               // Diffuse part
-               vec3 N = normalize(normal);
-               float NdotL = max(0.0, dot(N, L));
-               vec3 diff = ubo.lights[i].color * albedo.rgb * NdotL * atten;
-
-               // Specular part
-               vec3 R = reflect(-L, N);
-               float NdotR = max(0.0, dot(R, V));
-               vec3 spec = ubo.lights[i].color * albedo.a * pow(NdotR, 8.0) * atten;
-
-               result += diff + spec;  
-       }
-       return result;
-}
-
-void main() 
-{
-       ivec2 attDim = textureSize(samplerPosition);
-       ivec2 UV = ivec2(inUV * attDim);
-       
-       #define ambient 0.15
-
-       // Ambient part
-       vec4 alb = resolve(samplerAlbedo, UV);
-       vec3 fragColor = vec3(0.0);
-       
-       // Calualte lighting for every MSAA sample
-       for (int i = 0; i < NUM_SAMPLES; i++)
-       { 
-               vec3 pos = texelFetch(samplerPosition, UV, i).rgb;
-               vec3 normal = texelFetch(samplerNormal, UV, i).rgb;
-               vec4 albedo = texelFetch(samplerAlbedo, UV, i);
-               fragColor += calculateLighting(pos, normal, albedo);
-       }
-
-       fragColor = (alb.rgb * ambient) + fragColor / float(NUM_SAMPLES);
-   
-       outFragcolor = vec4(fragColor, 1.0);    
-}
\ No newline at end of file
diff --git a/shaders/deferred.vert b/shaders/deferred.vert
deleted file mode 100644 (file)
index 6227952..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#version 450
-
-#extension GL_ARB_separate_shader_objects : enable
-#extension GL_ARB_shading_language_420pack : enable
-
-layout (binding = 0) uniform UBO 
-{
-       mat4 projection;
-       mat4 model;
-} ubo;
-
-layout (location = 0) out vec2 outUV;
-
-out gl_PerVertex
-{
-       vec4 gl_Position;
-};
-
-void main() 
-{
-       outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
-       gl_Position = vec4(outUV * 2.0f - 1.0f, 0.0f, 1.0f);
-}
diff --git a/shaders/paint.frag b/shaders/paint.frag
deleted file mode 100644 (file)
index a46e3da..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#version 450
-
-#extension GL_ARB_separate_shader_objects : enable
-#extension GL_ARB_shading_language_420pack : enable
-
-layout (binding = 0) uniform sampler2D tex;
-
-layout (location = 0) in vec4 inColor;
-layout (location = 1) in vec3 inUV;
-
-layout (location = 0) out vec4 outFragColor;
-
-void main()
-{
-       vec4 c = texture(tex, inUV.xy);
-       outFragColor = c;
-}
diff --git a/shaders/triangle.frag b/shaders/triangle.frag
deleted file mode 100644 (file)
index e494451..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#version 450
-
-#extension GL_ARB_separate_shader_objects      : enable
-#extension GL_ARB_shading_language_420pack     : enable
-
-layout (set=0, binding = 0) uniform sampler2DArray fontMap;
-layout (set=1, binding = 0) uniform sampler2D          source;
-
-layout (location = 0) in vec4 inColor;         //source rgba
-layout (location = 1) in vec3 inFontUV;                //if it is a text drawing, inFontUV.z hold fontMap layer
-layout (location = 2) in vec4 inSrcRect;       //source bounds
-
-layout (location = 0) out vec4 outFragColor;
-
-layout (constant_id = 0) const int NUM_SAMPLES = 8;
-
-void main()
-{
-       vec4 c = inColor;
-       if (inSrcRect.z > 0.0){
-               vec2 srcUV = (gl_FragCoord.xy - inSrcRect.xy) / inSrcRect.zw;
-               c = texture(source, srcUV);
-       }
-       if (inFontUV.z >= 0.0)
-               c *= texture(fontMap, inFontUV).r;
-
-       outFragColor = c;
-}
diff --git a/shaders/triangle.vert b/shaders/triangle.vert
deleted file mode 100644 (file)
index 4e583c4..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-#version 450
-
-#extension GL_ARB_separate_shader_objects : enable
-#extension GL_ARB_shading_language_420pack : enable
-
-layout (location = 0) in vec2 inPos;
-layout (location = 1) in vec3 inUV;
-
-layout (location = 0) out vec4 outColor;
-layout (location = 1) out vec3 outUV;
-layout (location = 2) out vec4 outSrcRect;
-
-out gl_PerVertex
-{
-       vec4 gl_Position;
-};
-
-layout(push_constant) uniform PushConsts {
-       vec4 source;
-       vec2 scale;
-       vec2 translate;
-       int  srcType;
-} pushConsts;
-
-void main()
-{
-       outUV = inUV;
-       if (pushConsts.srcType == 0){
-               outSrcRect.z = -1;
-               outColor = pushConsts.source;
-       }else
-               outSrcRect = pushConsts.source;
-
-       gl_Position = vec4(inPos.xy * pushConsts.scale - vec2(1), 0.0, 1.0);
-}
diff --git a/shaders/vkvg_main.frag b/shaders/vkvg_main.frag
new file mode 100644 (file)
index 0000000..e494451
--- /dev/null
@@ -0,0 +1,28 @@
+#version 450
+
+#extension GL_ARB_separate_shader_objects      : enable
+#extension GL_ARB_shading_language_420pack     : enable
+
+layout (set=0, binding = 0) uniform sampler2DArray fontMap;
+layout (set=1, binding = 0) uniform sampler2D          source;
+
+layout (location = 0) in vec4 inColor;         //source rgba
+layout (location = 1) in vec3 inFontUV;                //if it is a text drawing, inFontUV.z hold fontMap layer
+layout (location = 2) in vec4 inSrcRect;       //source bounds
+
+layout (location = 0) out vec4 outFragColor;
+
+layout (constant_id = 0) const int NUM_SAMPLES = 8;
+
+void main()
+{
+       vec4 c = inColor;
+       if (inSrcRect.z > 0.0){
+               vec2 srcUV = (gl_FragCoord.xy - inSrcRect.xy) / inSrcRect.zw;
+               c = texture(source, srcUV);
+       }
+       if (inFontUV.z >= 0.0)
+               c *= texture(fontMap, inFontUV).r;
+
+       outFragColor = c;
+}
diff --git a/shaders/vkvg_main.vert b/shaders/vkvg_main.vert
new file mode 100644 (file)
index 0000000..4e583c4
--- /dev/null
@@ -0,0 +1,35 @@
+#version 450
+
+#extension GL_ARB_separate_shader_objects : enable
+#extension GL_ARB_shading_language_420pack : enable
+
+layout (location = 0) in vec2 inPos;
+layout (location = 1) in vec3 inUV;
+
+layout (location = 0) out vec4 outColor;
+layout (location = 1) out vec3 outUV;
+layout (location = 2) out vec4 outSrcRect;
+
+out gl_PerVertex
+{
+       vec4 gl_Position;
+};
+
+layout(push_constant) uniform PushConsts {
+       vec4 source;
+       vec2 scale;
+       vec2 translate;
+       int  srcType;
+} pushConsts;
+
+void main()
+{
+       outUV = inUV;
+       if (pushConsts.srcType == 0){
+               outSrcRect.z = -1;
+               outColor = pushConsts.source;
+       }else
+               outSrcRect = pushConsts.source;
+
+       gl_Position = vec4(inPos.xy * pushConsts.scale - vec2(1), 0.0, 1.0);
+}
index 93002b63b1f3f875f06c9343d933b041c45b36bf..43564bb9955e99bf17c28b8aca423c48cbca1a57 100644 (file)
@@ -1,604 +1,4 @@
-unsigned char deferred_frag_spv[] = {
-  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
-  0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x32, 0x00, 0x00, 0x00,
-  0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4c, 0x53, 0x4c,
-  0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00,
-  0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x0f, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
-  0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00,
-  0xed, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0xc2, 0x01, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x41,
-  0x52, 0x42, 0x5f, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x5f,
-  0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
-  0x74, 0x73, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x41,
-  0x52, 0x42, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c,
-  0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x34, 0x32, 0x30, 0x70,
-  0x61, 0x63, 0x6b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x47, 0x4c, 0x5f, 0x47,
-  0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x63, 0x70, 0x70, 0x5f, 0x73, 0x74,
-  0x79, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x64, 0x69, 0x72,
-  0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00,
-  0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x69, 0x6e,
-  0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
-  0x69, 0x76, 0x65, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00,
-  0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x07, 0x00,
-  0x11, 0x00, 0x00, 0x00, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x28,
-  0x73, 0x32, 0x4d, 0x31, 0x3b, 0x76, 0x69, 0x32, 0x3b, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x00,
-  0x05, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x75, 0x76, 0x00, 0x00,
-  0x05, 0x00, 0x0a, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x63, 0x61, 0x6c, 0x63,
-  0x75, 0x6c, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e,
-  0x67, 0x28, 0x76, 0x66, 0x33, 0x3b, 0x76, 0x66, 0x33, 0x3b, 0x76, 0x66,
-  0x34, 0x3b, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x17, 0x00, 0x00, 0x00,
-  0x70, 0x6f, 0x73, 0x00, 0x05, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00,
-  0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00,
-  0x19, 0x00, 0x00, 0x00, 0x61, 0x6c, 0x62, 0x65, 0x64, 0x6f, 0x00, 0x00,
-  0x05, 0x00, 0x04, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x72, 0x65, 0x73, 0x75,
-  0x6c, 0x74, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00,
-  0x69, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x28, 0x00, 0x00, 0x00,
-  0x4e, 0x55, 0x4d, 0x5f, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x53, 0x00,
-  0x05, 0x00, 0x03, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x76, 0x61, 0x6c, 0x00,
-  0x05, 0x00, 0x04, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x72, 0x65, 0x73, 0x75,
-  0x6c, 0x74, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x3f, 0x00, 0x00, 0x00,
-  0x69, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x48, 0x00, 0x00, 0x00,
-  0x4c, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x49, 0x00, 0x00, 0x00,
-  0x4c, 0x69, 0x67, 0x68, 0x74, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00,
-  0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x6f, 0x73, 0x69,
-  0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00,
-  0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6c, 0x6f,
-  0x72, 0x00, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00, 0x49, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x00, 0x00,
-  0x05, 0x00, 0x03, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x55, 0x42, 0x4f, 0x00,
-  0x06, 0x00, 0x05, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00,
-  0x4d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x76, 0x69, 0x65, 0x77,
-  0x50, 0x6f, 0x73, 0x00, 0x06, 0x00, 0x06, 0x00, 0x4d, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x69,
-  0x7a, 0x65, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x4f, 0x00, 0x00, 0x00,
-  0x75, 0x62, 0x6f, 0x00, 0x05, 0x00, 0x04, 0x00, 0x58, 0x00, 0x00, 0x00,
-  0x64, 0x69, 0x73, 0x74, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00,
-  0x5b, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00,
-  0x65, 0x00, 0x00, 0x00, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x03, 0x00, 0x71, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x04, 0x00, 0x74, 0x00, 0x00, 0x00, 0x4e, 0x64, 0x6f, 0x74,
-  0x4c, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x79, 0x00, 0x00, 0x00,
-  0x64, 0x69, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00,
-  0x85, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00,
-  0x8a, 0x00, 0x00, 0x00, 0x4e, 0x64, 0x6f, 0x74, 0x52, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x04, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x73, 0x70, 0x65, 0x63,
-  0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0xa7, 0x00, 0x00, 0x00,
-  0x61, 0x74, 0x74, 0x44, 0x69, 0x6d, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00,
-  0xa8, 0x00, 0x00, 0x00, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x50,
-  0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x05, 0x00, 0x03, 0x00,
-  0xac, 0x00, 0x00, 0x00, 0x55, 0x56, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00,
-  0xaf, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x55, 0x56, 0x00, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x03, 0x00, 0xb5, 0x00, 0x00, 0x00, 0x61, 0x6c, 0x62, 0x00,
-  0x05, 0x00, 0x06, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x73, 0x61, 0x6d, 0x70,
-  0x6c, 0x65, 0x72, 0x41, 0x6c, 0x62, 0x65, 0x64, 0x6f, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x04, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61,
-  0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0xba, 0x00, 0x00, 0x00,
-  0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x03, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x70, 0x6f, 0x73, 0x00,
-  0x05, 0x00, 0x04, 0x00, 0xca, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x72, 0x6d,
-  0x61, 0x6c, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0xcb, 0x00, 0x00, 0x00,
-  0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x4e, 0x6f, 0x72, 0x6d, 0x61,
-  0x6c, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0xd2, 0x00, 0x00, 0x00,
-  0x61, 0x6c, 0x62, 0x65, 0x64, 0x6f, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00,
-  0xd8, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00,
-  0x05, 0x00, 0x04, 0x00, 0xda, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61,
-  0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0xdc, 0x00, 0x00, 0x00,
-  0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00,
-  0xed, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x46, 0x72, 0x61, 0x67, 0x63,
-  0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
-  0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x48, 0x00, 0x05, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
-  0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
-  0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x49, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-  0x47, 0x00, 0x04, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x4d, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x48, 0x00, 0x05, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x23, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
-  0x4d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
-  0xd0, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x4d, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x4f, 0x00, 0x00, 0x00,
-  0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
-  0x4f, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
-  0x47, 0x00, 0x04, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xa8, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
-  0xaf, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x47, 0x00, 0x04, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xb6, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
-  0xcb, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x47, 0x00, 0x04, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xed, 0x00, 0x00, 0x00,
-  0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x00, 0x00, 0x19, 0x00, 0x09, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x17, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x21, 0x00, 0x06, 0x00,
-  0x16, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
-  0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x2c, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-  0x1d, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
-  0x1d, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x1f, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x32, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
-  0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x29, 0x00, 0x00, 0x00,
-  0x2b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x06, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
-  0x1d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x46, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x05, 0x00,
-  0x49, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x4a, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
-  0x4a, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x1c, 0x00, 0x04, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00,
-  0x4b, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x05, 0x00, 0x4d, 0x00, 0x00, 0x00,
-  0x4c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x04, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x4d, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x4e, 0x00, 0x00, 0x00,
-  0x4f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
-  0x51, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x04, 0x00, 0x57, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x67, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
-  0x68, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x40, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x20, 0x00, 0x04, 0x00,
-  0x7b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x2b, 0x00, 0x04, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00,
-  0x03, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x3b, 0x00, 0x04, 0x00,
-  0x09, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x17, 0x00, 0x04, 0x00, 0xad, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0xae, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0xae, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00,
-  0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x19, 0x3e,
-  0x20, 0x00, 0x04, 0x00, 0xec, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0xec, 0x00, 0x00, 0x00,
-  0xed, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
-  0xac, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x15, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,
-  0xba, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x1f, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,
-  0xca, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x15, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,
-  0xda, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x15, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00,
-  0xa8, 0x00, 0x00, 0x00, 0x64, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0xaa, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0x68, 0x00, 0x04, 0x00,
-  0x0b, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0xa7, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0xad, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00,
-  0xaf, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00,
-  0xb1, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x04, 0x00,
-  0xad, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00,
-  0x85, 0x00, 0x05, 0x00, 0xad, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00,
-  0xb0, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x04, 0x00,
-  0x0b, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0xac, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00,
-  0xac, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xb7, 0x00, 0x00, 0x00,
-  0xb8, 0x00, 0x00, 0x00, 0x39, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0xb9, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00,
-  0xb7, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xb5, 0x00, 0x00, 0x00,
-  0xb9, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xba, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xbb, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x02, 0x00, 0xbc, 0x00, 0x00, 0x00,
-  0xf8, 0x00, 0x02, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x04, 0x00,
-  0xbe, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xf9, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
-  0xc0, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0xc1, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x05, 0x00,
-  0x29, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00,
-  0x28, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x04, 0x00, 0xc2, 0x00, 0x00, 0x00,
-  0xbd, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
-  0xbd, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
-  0xc4, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x0b, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00,
-  0xbb, 0x00, 0x00, 0x00, 0x64, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0xc7, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x07, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00,
-  0xc5, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00,
-  0x4f, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00,
-  0xc8, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0xc3, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x08, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00,
-  0xac, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0xce, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x64, 0x00, 0x04, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00,
-  0x5f, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00,
-  0xcf, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
-  0xce, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0xd1, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0xca, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00,
-  0xb6, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00,
-  0xd4, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00,
-  0x64, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00,
-  0xd3, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0xd7, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00,
-  0x40, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0xd2, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00,
-  0xca, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xda, 0x00, 0x00, 0x00,
-  0xdb, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0xdd, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0xdc, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0x39, 0x00, 0x07, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
-  0xd8, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00,
-  0xba, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0xe0, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0xba, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
-  0xf9, 0x00, 0x02, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
-  0xbf, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0xe1, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x80, 0x00, 0x05, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00,
-  0x35, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xbb, 0x00, 0x00, 0x00,
-  0xe2, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x02, 0x00, 0xbc, 0x00, 0x00, 0x00,
-  0xf8, 0x00, 0x02, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00,
-  0x4f, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
-  0xe3, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
-  0xe5, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0xe7, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x04, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
-  0x50, 0x00, 0x06, 0x00, 0x13, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00,
-  0xe8, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00,
-  0x88, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00,
-  0xe7, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00,
-  0xea, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xba, 0x00, 0x00, 0x00,
-  0xeb, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0xee, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0xf0, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00,
-  0xee, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00,
-  0xf0, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0xed, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00,
-  0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x0e, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00,
-  0x0f, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x00, 0x00,
-  0x10, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x1f, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x15, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
-  0xf9, 0x00, 0x02, 0x00, 0x22, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
-  0x22, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x04, 0x00, 0x24, 0x00, 0x00, 0x00,
-  0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x02, 0x00,
-  0x26, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x26, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x05, 0x00, 0x29, 0x00, 0x00, 0x00,
-  0x2a, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
-  0xfa, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
-  0x24, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x23, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00,
-  0x0f, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00,
-  0x2d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
-  0x64, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00,
-  0x2c, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0x30, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00,
-  0x40, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0x2b, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
-  0x1c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0x33, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00,
-  0xf9, 0x00, 0x02, 0x00, 0x25, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
-  0x25, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x34, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x05, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
-  0x35, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00,
-  0x36, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x02, 0x00, 0x22, 0x00, 0x00, 0x00,
-  0xf8, 0x00, 0x02, 0x00, 0x24, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-  0x6f, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-  0x28, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0x39, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
-  0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00,
-  0x39, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, 0x3a, 0x00, 0x00, 0x00,
-  0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
-  0x37, 0x00, 0x03, 0x00, 0x14, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
-  0x37, 0x00, 0x03, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-  0x37, 0x00, 0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
-  0xf8, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x14, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,
-  0x48, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x57, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x57, 0x00, 0x00, 0x00,
-  0x65, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x14, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x57, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,
-  0x79, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x14, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x57, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00,
-  0x8f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0x3d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0x3f, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x02, 0x00,
-  0x40, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00,
-  0xf6, 0x00, 0x04, 0x00, 0x42, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x02, 0x00, 0x44, 0x00, 0x00, 0x00,
-  0xf8, 0x00, 0x02, 0x00, 0x44, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-  0xb1, 0x00, 0x05, 0x00, 0x29, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00,
-  0x45, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x04, 0x00,
-  0x47, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00,
-  0xf8, 0x00, 0x02, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-  0x41, 0x00, 0x07, 0x00, 0x51, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,
-  0x4f, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0x53, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x08, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00,
-  0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x55, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
-  0x55, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x48, 0x00, 0x00, 0x00,
-  0x56, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x59, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x42, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0x58, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00,
-  0x51, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00,
-  0x35, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0x5d, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x08, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00,
-  0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x5f, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00,
-  0x5f, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x5b, 0x00, 0x00, 0x00,
-  0x60, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x61, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x45, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0x5b, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
-  0x0c, 0x00, 0x06, 0x00, 0x13, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0x48, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00,
-  0x3f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x07, 0x00, 0x68, 0x00, 0x00, 0x00,
-  0x69, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
-  0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00,
-  0x58, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x6d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
-  0x6b, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00,
-  0x6e, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x70, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0x65, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00,
-  0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x73, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00,
-  0x72, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x71, 0x00, 0x00, 0x00,
-  0x73, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x75, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
-  0x94, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
-  0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x28, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0x74, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00,
-  0x3f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x07, 0x00, 0x7b, 0x00, 0x00, 0x00,
-  0x7c, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
-  0x7a, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00,
-  0x19, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x7f, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x85, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
-  0x7d, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00,
-  0x8e, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00,
-  0x80, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00,
-  0x8e, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00,
-  0x82, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0x79, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
-  0x7f, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00,
-  0x86, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x88, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x47, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0x85, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00,
-  0x85, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x8c, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x94, 0x00, 0x05, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00,
-  0x8c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x8e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
-  0x1d, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0x8a, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,
-  0x41, 0x00, 0x07, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00,
-  0x4f, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00,
-  0x35, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x92, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00,
-  0x57, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
-  0x93, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x95, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00,
-  0x95, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x97, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x1a, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00,
-  0x8e, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00,
-  0x96, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00,
-  0x8e, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00,
-  0x9a, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0x8f, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00,
-  0x8f, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x9f, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x13, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0xa1, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0x3d, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00,
-  0xf9, 0x00, 0x02, 0x00, 0x43, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
-  0x43, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0xa2, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x05, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00,
-  0x35, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x3f, 0x00, 0x00, 0x00,
-  0xa3, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00,
-  0xf8, 0x00, 0x02, 0x00, 0x42, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00,
-  0xfe, 0x00, 0x02, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00
-};
-unsigned int deferred_frag_spv_len = 6240;
-unsigned char paint_frag_spv[] = {
-  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
-  0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
-  0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00,
-  0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
-  0x11, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
-  0x10, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00,
-  0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73,
-  0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x64,
-  0x65, 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x00, 0x00,
-  0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73,
-  0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75,
-  0x61, 0x67, 0x65, 0x5f, 0x34, 0x32, 0x30, 0x70, 0x61, 0x63, 0x6b, 0x00,
-  0x04, 0x00, 0x0a, 0x00, 0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c,
-  0x45, 0x5f, 0x63, 0x70, 0x70, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f,
-  0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
-  0x76, 0x65, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x47, 0x4c, 0x5f, 0x47,
-  0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
-  0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00,
-  0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e,
-  0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00,
-  0x63, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0x74, 0x65, 0x78, 0x00, 0x05, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00,
-  0x69, 0x6e, 0x55, 0x56, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00,
-  0x17, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x46, 0x72, 0x61, 0x67, 0x43,
-  0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00,
-  0x1a, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00,
-  0x47, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
-  0x11, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x47, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x00,
-  0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
-  0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x19, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x1b, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x0b, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
-  0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x0f, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00,
-  0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
-  0x12, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00,
-  0x17, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
-  0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-  0xf8, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x07, 0x00,
-  0x12, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x57, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
-  0x0e, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00,
-  0x09, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0x17, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
-  0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
-};
-unsigned int paint_frag_spv_len = 884;
-unsigned char triangle_frag_spv[] = {
+unsigned char vkvg_main_frag_spv[] = {
   0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
   0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
   0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
@@ -755,7 +155,7 @@ unsigned char triangle_frag_spv[] = {
   0x09, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x3f, 0x00, 0x00, 0x00,
   0x40, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
 };
-unsigned int triangle_frag_spv_len = 1860;
+unsigned int vkvg_main_frag_spv_len = 1860;
 unsigned char wired_frag_spv[] = {
   0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
   0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
@@ -918,126 +318,7 @@ unsigned char wired_frag_spv[] = {
   0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
 };
 unsigned int wired_frag_spv_len = 1904;
-unsigned char deferred_vert_spv[] = {
-  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
-  0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
-  0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
-  0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
-  0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00,
-  0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73,
-  0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x64,
-  0x65, 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x00, 0x00,
-  0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73,
-  0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75,
-  0x61, 0x67, 0x65, 0x5f, 0x34, 0x32, 0x30, 0x70, 0x61, 0x63, 0x6b, 0x00,
-  0x04, 0x00, 0x0a, 0x00, 0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c,
-  0x45, 0x5f, 0x63, 0x70, 0x70, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f,
-  0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
-  0x76, 0x65, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x47, 0x4c, 0x5f, 0x47,
-  0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
-  0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00,
-  0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e,
-  0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00,
-  0x6f, 0x75, 0x74, 0x55, 0x56, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00,
-  0x0c, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65,
-  0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00,
-  0x18, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x65, 0x72, 0x56, 0x65,
-  0x72, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00,
-  0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50,
-  0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x05, 0x00, 0x03, 0x00,
-  0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00,
-  0x29, 0x00, 0x00, 0x00, 0x55, 0x42, 0x4f, 0x00, 0x06, 0x00, 0x06, 0x00,
-  0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x72, 0x6f, 0x6a,
-  0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00,
-  0x29, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6d, 0x6f, 0x64, 0x65,
-  0x6c, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x2b, 0x00, 0x00, 0x00,
-  0x75, 0x62, 0x6f, 0x00, 0x47, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00,
-  0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
-  0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00,
-  0x48, 0x00, 0x05, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00,
-  0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x04, 0x00,
-  0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
-  0x48, 0x00, 0x05, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
-  0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x04, 0x00, 0x29, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
-  0x29, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
-  0x40, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x29, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
-  0x47, 0x00, 0x03, 0x00, 0x29, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x47, 0x00, 0x04, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x2b, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
-  0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
-  0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
-  0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x3b, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
-  0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x17, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00,
-  0x17, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x19, 0x00, 0x00, 0x00,
-  0x03, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x19, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
-  0x2b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x2b, 0x00, 0x04, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f,
-  0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x26, 0x00, 0x00, 0x00,
-  0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00,
-  0x28, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
-  0x1e, 0x00, 0x04, 0x00, 0x29, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
-  0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
-  0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
-  0x05, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x05, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
-  0x0e, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x11, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
-  0x6f, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
-  0x11, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
-  0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x05, 0x00,
-  0x0a, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x10, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x50, 0x00, 0x05, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
-  0x15, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00,
-  0x16, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x1c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00,
-  0x07, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
-  0x1d, 0x00, 0x00, 0x00, 0x50, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
-  0x83, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
-  0x1e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00,
-  0x06, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00,
-  0x24, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-  0x50, 0x00, 0x07, 0x00, 0x17, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00,
-  0x23, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
-  0x1f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x26, 0x00, 0x00, 0x00,
-  0x27, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00,
-  0x3e, 0x00, 0x03, 0x00, 0x27, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00,
-  0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
-};
-unsigned int deferred_vert_spv_len = 1388;
-unsigned char triangle_vert_spv[] = {
+unsigned char vkvg_main_vert_spv[] = {
   0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
   0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
   0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
@@ -1191,7 +472,7 @@ unsigned char triangle_vert_spv[] = {
   0x17, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x3c, 0x00, 0x00, 0x00,
   0x3b, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
 };
-unsigned int triangle_vert_spv_len = 1824;
+unsigned int vkvg_main_vert_spv_len = 1824;
 unsigned char shader_comp_spv[] = {
   0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
   0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
index ebbaa44e2bea3f167c3fb5ee9b39b26789faecda..2e5c0394d1792514be1e9332a5719d0b73953ba0 100644 (file)
@@ -1,6 +1,7 @@
 #include "vkvg_device_internal.h"
 #include "vkvg_context_internal.h"
 #include "vkvg_surface_internal.h"
+#include "vkh_queue.h"
 
 #ifdef DEBUG
 static vec2 debugLinePoints[1000];
@@ -40,7 +41,7 @@ VkvgContext vkvg_create(VkvgSurface surf)
     ctx->points = (vec2*)       malloc (VKVG_VBO_SIZE*sizeof(vec2));
     ctx->pathes = (uint32_t*)   malloc (VKVG_PATHES_SIZE*sizeof(uint32_t));
 
-    ctx->cmdPool = vkh_cmd_pool_create (dev->vkDev, dev->qFam, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
+    ctx->cmdPool = vkh_cmd_pool_create (dev->vkDev, dev->gQueue->familyIndex, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
 
     _create_vertices_buff   (ctx);
     _create_cmd_buff        (ctx);
@@ -84,6 +85,7 @@ void vkvg_destroy (VkvgContext ctx)
     _flush_cmd_buff(ctx);
 
     VkDevice dev = ctx->pSurf->dev->vkDev;
+
     vkDestroyFence      (dev, ctx->flushFence,NULL);
     vkFreeCommandBuffers(dev, ctx->cmdPool, 1, &ctx->cmd);
     vkDestroyCommandPool(dev, ctx->cmdPool, NULL);
index 3d7f317b59b8fcef6c650be1fc4d8cbc26e319b3..3220a0259f59480665dfb7b430c47cac687792f7 100644 (file)
@@ -11,6 +11,7 @@
 #include "vkvg_surface_internal.h"
 #include "vkvg_context_internal.h"
 #include "vkvg_device_internal.h"
+#include "vkh_queue.h"
 
 void _check_pathes_array (VkvgContext ctx){
     if (ctx->sizePathes - ctx->pathPtr > VKVG_ARRAY_THRESHOLD)
@@ -99,17 +100,8 @@ void _record_draw_cmd (VkvgContext ctx){
     ctx->curIndStart = ctx->indCount;
 }
 
-void _submit_ctx_cmd (VkvgContext ctx){
-    VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
-    VkSubmitInfo submit_info = { .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
-                                 .commandBufferCount = 1,
-                                 .signalSemaphoreCount = 0,
-                                 .pSignalSemaphores = NULL,
-                                 .waitSemaphoreCount = 0,
-                                 .pWaitSemaphores = NULL,
-                                 .pWaitDstStageMask = &dstStageMask,
-                                 .pCommandBuffers = &ctx->cmd};
-    VK_CHECK_RESULT(vkQueueSubmit(ctx->pSurf->dev->queue, 1, &submit_info, ctx->flushFence));
+inline void _submit_ctx_cmd(VkvgContext ctx){
+    vkh_cmd_submit (ctx->pSurf->dev->gQueue, &ctx->cmd, ctx->flushFence);
 }
 void _wait_and_reset_ctx_cmd (VkvgContext ctx){
     vkWaitForFences(ctx->pSurf->dev->vkDev,1,&ctx->flushFence,VK_TRUE,UINT64_MAX);
@@ -117,7 +109,7 @@ void _wait_and_reset_ctx_cmd (VkvgContext ctx){
     vkResetCommandBuffer(ctx->cmd,0);
 }
 
-void _submit_wait_and_reset_cmd (VkvgContext ctx){
+inline void _submit_wait_and_reset_cmd (VkvgContext ctx){
     _submit_ctx_cmd(ctx);
     _wait_and_reset_ctx_cmd(ctx);
 }
@@ -249,13 +241,16 @@ void _reset_src_descriptor_set (VkvgContext ctx){
 
 void _createDescriptorPool (VkvgContext ctx) {
     VkvgDevice dev = ctx->pSurf->dev;
-    VkDescriptorPoolSize descriptorPoolSize = {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 };
+    const VkDescriptorPoolSize descriptorPoolSize[] = {
+        {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 },
+        {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1 }
+    };
     VkDescriptorPoolCreateInfo descriptorPoolCreateInfo = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
-                                                            .maxSets = 2,
+                                                            .maxSets = 3,
                                                             .flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
-                                                            .poolSizeCount = 1,
-                                                            .pPoolSizes = &descriptorPoolSize };
-    VK_CHECK_RESULT(vkCreateDescriptorPool(dev->vkDev, &descriptorPoolCreateInfo, NULL, &ctx->descriptorPool));
+                                                            .poolSizeCount = 2,
+                                                            .pPoolSizes = descriptorPoolSize };
+    VK_CHECK_RESULT(vkCreateDescriptorPool (dev->vkDev, &descriptorPoolCreateInfo, NULL, &ctx->descriptorPool));
 }
 void _init_descriptor_sets (VkvgContext ctx){
     VkvgDevice dev = ctx->pSurf->dev;
index 8d4e397e2fbe88f0c7cec66be539648dee13eb5b..a1d8acc18d36ece817f73401e907a324e1acb7d6 100644 (file)
@@ -1,4 +1,5 @@
 #include "vkvg_device_internal.h"
+#include "vkh_queue.h"
 
 VkvgDevice vkvg_device_create(VkPhysicalDevice phy, VkDevice vkdev, VkQueue queue, uint32_t qFam)
 {
@@ -8,19 +9,15 @@ VkvgDevice vkvg_device_create(VkPhysicalDevice phy, VkDevice vkdev, VkQueue queu
     dev->vdpi = 96;
 
     dev->vkDev = vkdev;
+    dev->phy = phy;
+
     vkGetPhysicalDeviceMemoryProperties (phy, &dev->phyMemProps);
 
-    for (int i=0; i<120; i++){
-        VkFormatProperties formatProps = {};
-        vkGetPhysicalDeviceFormatProperties (phy, (VkFormat)i, &formatProps);
-        printf("%d => Buff = %d, Lin = %d, Opt = %d\n", i, formatProps.bufferFeatures, formatProps.linearTilingFeatures, formatProps.optimalTilingFeatures);
-    }
+    dev->gQueue = vkh_queue_find (dev, VK_QUEUE_GRAPHICS_BIT);
 
-    dev->queue  = queue;
-    dev->qFam   = qFam;
     dev->lastCtx= NULL;
 
-    dev->cmdPool= vkh_cmd_pool_create       (dev->vkDev, qFam, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
+    dev->cmdPool= vkh_cmd_pool_create       (dev->vkDev, dev->gQueue->familyIndex, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
     dev->cmd    = vkh_cmd_buff_create       (dev->vkDev, dev->cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
     dev->fence  = vkh_fence_create_signaled (dev->vkDev);
 
@@ -33,7 +30,7 @@ VkvgDevice vkvg_device_create(VkPhysicalDevice phy, VkDevice vkdev, VkQueue queu
     return dev;
 }
 
-void vkvg_device_destroy(VkvgDevice dev)
+void vkvg_device_destroy (VkvgDevice dev)
 {
     vkDestroyDescriptorSetLayout    (dev->vkDev, dev->dslFont,NULL);
     vkDestroyDescriptorSetLayout    (dev->vkDev, dev->dslSrc, NULL);
index 360d1de4b9c728d8222656f1ad488dd2ce462583..d34e6cc5f813a1507cb3f6bbac0cc5a03b83b654 100644 (file)
@@ -184,11 +184,11 @@ void _setupPipelines(VkvgDevice dev)
 
     VkShaderModule modVert, modFrag, modFragWired;
     VkShaderModuleCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
-                                            .pCode = triangle_vert_spv,
-                                            .codeSize = triangle_vert_spv_len };
+                                            .pCode = vkvg_main_vert_spv,
+                                            .codeSize = vkvg_main_vert_spv_len };
     VK_CHECK_RESULT(vkCreateShaderModule(dev->vkDev, &createInfo, NULL, &modVert));
-    createInfo.pCode = triangle_frag_spv;
-    createInfo.codeSize = triangle_frag_spv_len;
+    createInfo.pCode = vkvg_main_frag_spv;
+    createInfo.codeSize = vkvg_main_frag_spv_len;
     VK_CHECK_RESULT(vkCreateShaderModule(dev->vkDev, &createInfo, NULL, &modFrag));
     createInfo.pCode = wired_frag_spv;
     createInfo.codeSize = wired_frag_spv_len;
index 95099e312863ee6cf0b6ee5f517543b73b0bc9d5..049ea7a5e8b3927372f1b2e66bff707f6bff9c64 100644 (file)
@@ -9,9 +9,10 @@ typedef struct _vkvg_device_t{
     VkDevice                           vkDev;
     VkPhysicalDeviceMemoryProperties phyMemProps;
     VkRenderPass                       renderPass;
+    VkPhysicalDevice        phy;
+
+    VkhQueue                gQueue;
 
-    VkQueue                                    queue;
-    uint32_t                qFam;
     VkCommandPool                      cmdPool;
     VkCommandBuffer         cmd;
     VkFence                 fence;
index b57f6fabea4585d444883ed5571f0afe33a95b8e..6ea90029f1c61aa3908a49a847b6f242053cf986 100644 (file)
@@ -72,7 +72,7 @@ void _increase_font_tex_array (VkvgDevice dev){
 
     VK_CHECK_RESULT(vkEndCommandBuffer(cache->cmd));
 
-    vkh_cmd_submit      (dev->queue, &cache->cmd, cache->uploadFence);
+    vkh_cmd_submit      (dev->gQueue, &cache->cmd, cache->uploadFence);
     vkWaitForFences     (dev->vkDev, 1, &cache->uploadFence, VK_TRUE, UINT64_MAX);
 
     _flush_all_contexes (dev);
@@ -191,7 +191,7 @@ void _flush_chars_to_tex (VkvgDevice dev, _vkvg_font_t* f) {
 
     VK_CHECK_RESULT(vkEndCommandBuffer(cache->cmd));
 
-    vkh_cmd_submit(dev->queue,&cache->cmd,cache->uploadFence);
+    vkh_cmd_submit(dev->gQueue,&cache->cmd,cache->uploadFence);
 
     f->curLine.penX += cache->stagingX;
     cache->stagingX = 0;
index be3282c7a147c6c9d76d624c2ef7c7f1e2377d4a..8c9eda11266f15488b4aeaf8fd48b43ddf3d12b7 100644 (file)
@@ -4,71 +4,72 @@
 #include "vkvg_pattern.h"
 
 VkvgPattern _init_pattern (VkvgDevice dev){
-    VkvgPattern pat = (vkvg_pattern*)calloc(1,sizeof(vkvg_pattern));
+    VkvgPattern pat = (vkvg_pattern_t*)calloc(1, sizeof(vkvg_pattern_t));
     pat->dev = dev;
-    VkDescriptorSetAllocateInfo descriptorSetAllocateInfo = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
-                                      .descriptorPool = dev->descriptorPool,
-                                      .descriptorSetCount = 1,
-                                      .pSetLayouts = &dev->dslFont };
-    VK_CHECK_RESULT(vkAllocateDescriptorSets(dev->vkDev, &descriptorSetAllocateInfo, &pat->descriptorSet));
     return pat;
 }
 
-void _update_descSet (VkvgPattern pat){
-    _font_cache_t* cache = pat->dev->fontCache;
-    VkDescriptorImageInfo descFontTex   = vkh_image_get_descriptor (cache->cacheTex,VK_IMAGE_LAYOUT_GENERAL);
-    VkDescriptorImageInfo descSrcTex    = vkh_image_get_descriptor (pat->img,       VK_IMAGE_LAYOUT_GENERAL);
-
-    VkWriteDescriptorSet writeDescriptorSet[] = {
-        {
-            .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
-            .dstSet = pat->descriptorSet,
-            .dstBinding = 0,
-            .descriptorCount = 1,
-            .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-            .pImageInfo = &descFontTex
-        },{
-            .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
-            .dstSet = pat->descriptorSet,
-            .dstBinding = 1,
-            .descriptorCount = 1,
-            .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
-            .pImageInfo = &descSrcTex
-        }};
-    vkUpdateDescriptorSets(pat->dev->vkDev, 2, &writeDescriptorSet, 0, NULL);
-}
-
 VkvgPattern vkvg_pattern_create(VkvgDevice dev){
     VkvgPattern pat = _init_pattern (dev);
+    pat->type = VKVG_PATTERN_TYPE_SOLID;
+    pat->data = (vkvg_color_t*)calloc(1,sizeof(vkvg_color_t));
     return pat;
 }
 
 VkvgPattern vkvg_pattern_create_for_surface (VkvgSurface surf){
     VkvgPattern pat = _init_pattern (surf->dev);
-    pat->img = surf->img;
+    pat->data = surf;
     return pat;
 }
-VkvgPattern vkvg_pattern_create_linear (float x0, float y0, float x1, float y1){
+VkvgPattern vkvg_pattern_create_linear (VkvgDevice dev, float x0, float y0, float x1, float y1){
+    VkvgPattern pat = _init_pattern (dev);
+
+    vkvg_gradient_t* grad = (vkvg_gradient_t*)calloc(1,sizeof(vkvg_gradient_t));
 
+    vec2 cp0 = {x0, y0}, cp1 = {x1, y1};
+    grad->cp[0] = cp0;
+    grad->cp[1] = cp1;
+
+    pat->data = grad;
+    return pat;
 }
-VkvgPattern vkvg_pattern_create_radial (float cx0, float cy0, float radius0,
+VkvgPattern vkvg_pattern_create_radial (VkvgDevice dev, float cx0, float cy0, float radius0,
                                         float cx1, float cy1, float radius1){
+    VkvgPattern pat = _init_pattern (dev);
+
+    vkvg_gradient_t* grad = (vkvg_gradient_t*)calloc(1,sizeof(vkvg_gradient_t));
+
+    vec2 cp0 = {cx0, cy0}, cp1 = {cx1, cy1}, rads = {radius0, radius1};
+    grad->cp[0] = cp0;
+    grad->cp[1] = cp1;
+    grad->cp[2] = rads;
+
+    pat->data = grad;
+    return pat;
+}
+void vkvg_patter_add_color_stop (VkvgPattern pat, float offset, float r, float g, float b, float a) {
+    if (pat->type == VKVG_PATTERN_TYPE_SURFACE || pat->type == VKVG_PATTERN_TYPE_SOLID){
+
+        return;
+    }
 
+    vkvg_gradient_t* grad = (vkvg_gradient_t*)pat->data;
+    vkvg_color_t c = {r,g,b,a};
+    grad->colors[grad->count] = c;
+    grad->stops[grad->count] = offset;
 }
 void vkvg_pattern_set_extend (VkvgPattern pat, vkvg_extend_t extend){
     pat->extend = extend;
 }
 
 void vkvg_set_source (VkvgContext ctx, VkvgPattern pat){
-    _update_descSet (pat);
 
-    vkCmdBindDescriptorSets(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pat->dev->pipelineLayout,
-                            0, 1, &pat->descriptorSet, 0, NULL);
 }
 
 void vkvg_pattern_destroy(VkvgPattern pat)
 {
-    vkFreeDescriptorSets(pat->dev, pat->dev->descriptorPool, 1, &pat->descriptorSet);
+    if (pat->type != VKVG_PATTERN_TYPE_SURFACE)
+        free (pat->data);
 
     free(pat);
 }
index 5356d28127fa697cc1954e03bff4df2080d6a04a..0fb9ff1fdda62faadf8a89196b79870673af4b72 100644 (file)
@@ -5,17 +5,21 @@
 #include "vkvg.h"
 #include "vkh.h"
 
-typedef enum _vkvg_extend {
-    VKVG_EXTEND_NONE,
-    VKVG_EXTEND_REPEAT,
-    VKVG_EXTEND_REFLECT,
-    VKVG_EXTEND_PAD
-} vkvg_extend_t;
-
 typedef struct _vkvg_pattern_t {
-    VkvgDevice         dev;
-    VkDescriptorSet    descriptorSet;
-    vkvg_extend_t      extend;
-    VkhImage           img;
-}vkvg_pattern;
+    vkvg_extend_t       extend;
+    vkvg_pattern_type_t type;
+    void*               data;
+
+    VkvgDevice          dev;
+    VkDescriptorSet     descriptorSet;
+    VkhImage            img;
+}vkvg_pattern_t;
+
+typedef struct _vkvg_gradient_t {
+    vec2        cp[3];
+    vkvg_color_t colors[32];
+    float       stops[32];
+    uint32_t    count;
+}vkvg_gradient_t;
+
 #endif
index 0e8955cc53653740b9559796b41cff82ddb079b8..f3e34ca2f4c7f80ac9f7983eaf218cd1a7a0891a 100644 (file)
@@ -26,7 +26,7 @@ void _clear_stencil (VkvgSurface surf)
             VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
     vkh_cmd_end (cmd);
 
-    vkh_cmd_submit (dev->queue, &cmd, dev->fence);
+    vkh_cmd_submit (dev->gQueue, &cmd, dev->fence);
 }
 
 void _init_surface (VkvgSurface surf) {
@@ -136,7 +136,7 @@ VkvgSurface vkvg_surface_create_from_image (VkvgDevice dev, const char* filePath
                      vkh_image_get_vkimage (tmpImg),  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit, VK_FILTER_LINEAR);
 
     vkh_cmd_end     (cmd);
-    vkh_cmd_submit  (dev->queue, &cmd, dev->fence);
+    vkh_cmd_submit  (dev->gQueue, &cmd, dev->fence);
 
     _wait_device_fence (dev);
 
index 71defd73678306b6ed44e64014a37f5e64962a15..534848f7f74d3b9339cc6a6780fa6d818aa866aa 100644 (file)
@@ -4,6 +4,8 @@
 #include "vke.h"
 //#include "compute.h"
 #include "vkh.h"
+#include "vkh_app.h"
+#include "vkh_phyinfo.h"
 
 #include "vkvg.h"
 
@@ -181,87 +183,25 @@ void vkengine_get_queues_properties (VkEngine* e, VkQueueFamilyProperties** qFam
 void EngineInit (VkEngine* e) {
     glfwInit();
     assert (glfwVulkanSupported()==GLFW_TRUE);
-    e->ExtensionNames = glfwGetRequiredInstanceExtensions (&e->EnabledExtensionsCount);
 
+    uint32_t enabledExtsCount = 0, phyCount = 0;
+    const char** enabledExts = glfwGetRequiredInstanceExtensions (&enabledExtsCount);
 
-    e->infos.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
-    e->infos.pNext = NULL;
-    e->infos.pApplicationName = APP_SHORT_NAME;
-    e->infos.applicationVersion = 1;
-    e->infos.pEngineName = APP_SHORT_NAME;
-    e->infos.engineVersion = 1;
-    e->infos.apiVersion = VK_API_VERSION_1_0;
-    e->renderer.width = 1024;
-    e->renderer.height = 800;
+    e->app = vkh_app_create("vkvgTest", enabledExtsCount, enabledExts);
 
-    const uint32_t enabledLayersCount = 1;
-
-    //const char* enabledLayers[] = {"VK_LAYER_LUNARG_core_validation"};
-    const char* enabledExtentions[] = {"VK_KHR_surface", "VK_KHR_swapchain","VK_KHR_xcb_surface"};
-    const char* enabledLayers[] = {"VK_LAYER_LUNARG_standard_validation"};
-
-    VkInstanceCreateInfo inst_info = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
-                                       .pNext = NULL,
-                                       .flags = 0,
-                                       .pApplicationInfo = &e->infos,
-                                       .enabledExtensionCount = e->EnabledExtensionsCount,
-                                       .ppEnabledExtensionNames = e->ExtensionNames,
-                                       .enabledLayerCount = 1,
-                                       .ppEnabledLayerNames = enabledLayers };
-
-    VK_CHECK_RESULT(vkCreateInstance (&inst_info, NULL, &e->inst));
-
-    e->phy = vkh_find_phy (e->inst, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
-
-    vkGetPhysicalDeviceMemoryProperties (e->phy, &e->memory_properties);
-    vkGetPhysicalDeviceProperties       (e->phy, &e->gpu_props);
-
-    /*VkImageFormatProperties imgProps = {};
-    vkGetPhysicalDeviceImageFormatProperties(e->phy,
-                                             VK_FORMAT_R8_UNORM,
-                                             VK_IMAGE_TYPE_2D,
-                                             VK_IMAGE_TILING_OPTIMAL,
-                                             VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT,
-                                             NULL,&imgProps );*/
-
-    int cQueue = -1, gQueue = -1, tQueue = -1;
-    uint32_t queue_family_count = 0;
-    VkQueueFamilyProperties *qfams;
-    vkengine_get_queues_properties(e,&qfams,&queue_family_count);
-
-    //try to find dedicated queues
-    for (int j=0; j<queue_family_count; j++){
-        switch (qfams[j].queueFlags) {
-        case VK_QUEUE_GRAPHICS_BIT:
-            if (gQueue<0)
-                gQueue = j;
-            break;
-        case VK_QUEUE_COMPUTE_BIT:
-            if (cQueue<0)
-                cQueue = j;
-            break;
-        case VK_QUEUE_TRANSFER_BIT:
-            if (tQueue<0)
-                tQueue = j;
+    VkhPhyInfo* phys = vkh_app_get_phyinfos(e->app, &phyCount);
+
+    VkhPhyInfo pi = NULL;
+    for (int i=0; i<phyCount; i++){
+        pi = phys[i];
+        if (pi->properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU){
+            e->phy = pi->phy;
             break;
         }
     }
-    //try to find suitable queue if no dedicated one found
-    for (int j=0; j<queue_family_count; j++){
-        if ((qfams[j].queueFlags & VK_QUEUE_GRAPHICS_BIT) && (gQueue < 0))
-            gQueue = j;
-        if ((qfams[j].queueFlags & VK_QUEUE_COMPUTE_BIT) && (cQueue < 0))
-            cQueue = j;
-        if ((qfams[j].queueFlags & VK_QUEUE_TRANSFER_BIT) && (tQueue < 0))
-            tQueue = j;
-    }
 
-    free (qfams);
-
-    if (gQueue<0||cQueue<0||tQueue<0){
-        fprintf (stderr, "Missing Queue type\n");
-        exit (-1);
-    }
+    e->memory_properties = pi->memProps;
+    e->gpu_props = pi->properties;
 
     uint32_t qCount = 0;
     VkDeviceQueueCreateInfo pQueueInfos[3];
@@ -269,19 +209,19 @@ void EngineInit (VkEngine* e) {
 
     VkDeviceQueueCreateInfo qiG = { .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
                                    .queueCount = 1,
-                                   .queueFamilyIndex = gQueue,
+                                   .queueFamilyIndex = pi->gQueue,
                                    .pQueuePriorities = queue_priorities };
     VkDeviceQueueCreateInfo qiC = { .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
                                    .queueCount = 1,
-                                   .queueFamilyIndex = cQueue,
+                                   .queueFamilyIndex = pi->cQueue,
                                    .pQueuePriorities = queue_priorities };
     VkDeviceQueueCreateInfo qiT = { .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
                                    .queueCount = 1,
-                                   .queueFamilyIndex = tQueue,
+                                   .queueFamilyIndex = pi->tQueue,
                                    .pQueuePriorities = queue_priorities };
 
-    if (gQueue == cQueue){
-        if(gQueue == tQueue){
+    if (pi->gQueue == pi->cQueue){
+        if(pi->gQueue == pi->tQueue){
             qCount=1;
             pQueueInfos[0] = qiG;
         }else{
@@ -290,7 +230,7 @@ void EngineInit (VkEngine* e) {
             pQueueInfos[1] = qiT;
         }
     }else{
-        if((gQueue == tQueue) || (cQueue==tQueue)){
+        if((pi->gQueue == pi->tQueue) || (pi->cQueue==pi->tQueue)){
             qCount=2;
             pQueueInfos[0] = qiG;
             pQueueInfos[1] = qiC;
@@ -308,7 +248,11 @@ void EngineInit (VkEngine* e) {
 
     VK_CHECK_RESULT(vkCreateDevice(e->phy, &device_info, NULL, &e->dev));
 
-    assert (glfwGetPhysicalDevicePresentationSupport (e->inst, e->phy, gQueue)==GLFW_TRUE);
+
+    assert (glfwGetPhysicalDevicePresentationSupport (e->app->inst, e->phy, pi->gQueue)==GLFW_TRUE);
+
+    e->renderer.width = 1024;
+    e->renderer.height = 800;
 
     glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
     glfwWindowHint(GLFW_RESIZABLE,  GLFW_TRUE);
@@ -320,20 +264,22 @@ void EngineInit (VkEngine* e) {
 
     r->window = glfwCreateWindow(r->width, r->height, "Window Title", NULL, NULL);
 
-    assert (glfwCreateWindowSurface(e->inst, r->window, NULL, &r->surface)==VK_SUCCESS);
+    assert (glfwCreateWindowSurface(e->app->inst, r->window, NULL, &r->surface)==VK_SUCCESS);
 
     VkBool32 isSupported;
-    vkGetPhysicalDeviceSurfaceSupportKHR(e->phy, gQueue, r->surface, &isSupported);
+    vkGetPhysicalDeviceSurfaceSupportKHR(e->phy, pi->gQueue, r->surface, &isSupported);
     assert (isSupported && "vkGetPhysicalDeviceSurfaceSupportKHR");
 
-    vkGetDeviceQueue(e->dev, gQueue, 0, &e->renderer.queue);
-    e->renderer.qFam = gQueue;
-    vkGetDeviceQueue(e->dev, cQueue, 0, &e->computer.queue);
-    vkGetDeviceQueue(e->dev, tQueue, 0, &e->loader.queue);
+    vkGetDeviceQueue(e->dev, pi->gQueue, 0, &e->renderer.queue);
+    e->renderer.qFam = pi->gQueue;
+    vkGetDeviceQueue(e->dev, pi->cQueue, 0, &e->computer.queue);
+    vkGetDeviceQueue(e->dev, pi->tQueue, 0, &e->loader.queue);
 
-    e->renderer.cmdPool = vkh_cmd_pool_create (e->dev, gQueue, 0);
-    e->computer.cmdPool = vkh_cmd_pool_create (e->dev, cQueue, 0);
-    e->loader.cmdPool = vkh_cmd_pool_create (e->dev, tQueue, 0);
+    e->renderer.cmdPool = vkh_cmd_pool_create (e->dev, pi->gQueue, 0);
+    e->computer.cmdPool = vkh_cmd_pool_create (e->dev, pi->cQueue, 0);
+    e->loader.cmdPool = vkh_cmd_pool_create (e->dev, pi->tQueue, 0);
+
+    vkh_app_free_phyinfos (phyCount, phys);
 
     r->semaPresentEnd = vkh_semaphore_create(e->dev);
     r->semaDrawEnd = vkh_semaphore_create(e->dev);
@@ -353,11 +299,11 @@ void EngineTerminate (VkEngine* e) {
     vkDestroyCommandPool (e->dev, e->loader.cmdPool, NULL);
 
     vkDestroyDevice (e->dev, NULL);
-    vkDestroySurfaceKHR (e->inst, r->surface, NULL);
+    vkDestroySurfaceKHR (e->app->inst, r->surface, NULL);
     glfwDestroyWindow (r->window);
     glfwTerminate ();
 
-    vkDestroyInstance (e->inst, NULL);
+    vkh_app_destroy (e->app);
 }
 
 static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
@@ -443,6 +389,17 @@ void draw(VkEngine* e) {
         VK_CHECK_RESULT(vkQueuePresentKHR(r->queue, &present));
     }
 }
+void vkvg_test_clip(VkvgContext ctx){
+    vkvg_move_to(ctx,100,100);
+    vkvg_line_to(ctx,400,350);
+    vkvg_line_to(ctx,900,150);
+    vkvg_line_to(ctx,700,450);
+    vkvg_line_to(ctx,900,750);
+    vkvg_line_to(ctx,500,650);
+    vkvg_line_to(ctx,100,800);
+    vkvg_line_to(ctx,150,400);
+    vkvg_clip(ctx);
+}
 void vkvg_test_fill(VkvgContext ctx){
     vkvg_set_rgba(ctx,0.1,0.1,0.8,1.0);
     vkvg_move_to(ctx,100,100);
@@ -684,12 +641,15 @@ int main(int argc, char *argv[]) {
 
     vkvg_set_rgba(ctx,0.02,0.02,0.3,1.0);
     vkvg_paint(ctx);
+
+    vkvg_test_clip(ctx);
+
     vkvg_set_rgba (ctx,0.02,0.8,0.3,1.0);
     vkvg_rectangle (ctx,200,200,300,300);
     vkvg_fill (ctx);
 
     vkvg_test_fill2(ctx);
-    vkvg_test_fill(ctx);
+    //vkvg_test_fill(ctx);
     vkvg_test_stroke(ctx);
     vkvg_test_curves(ctx);
     test_text(ctx);
index f3c63a42ac6e8c6d01a567ad91373171fab4b48c..751ee6a869793cbff705b25311af10ebcf5a37bf 100644 (file)
@@ -9,6 +9,8 @@
 #include <GLFW/glfw3.h>
 #include <vulkan/vulkan.h>
 
+#include "vkh.h"
+
 #define APP_SHORT_NAME "vkcrow_test"
 /* Number of samples needs to be the same at image creation,      */
 /* renderpass creation and pipeline creation.                     */
@@ -60,16 +62,12 @@ typedef struct VkComputer_t {
 }VkComputer;
 
 typedef struct VkEngine_t {
-    VkApplicationInfo   infos;
-    VkInstance          inst;
+    VkhApp              app;
     VkPhysicalDevice    phy;
     VkPhysicalDeviceMemoryProperties    memory_properties;
     VkPhysicalDeviceProperties          gpu_props;
     VkDevice            dev;
 
-    uint32_t            EnabledExtensionsCount;
-    const char**        ExtensionNames;
-
     vkh_presenter       renderer;
     VkComputer          computer;
     VkLoader            loader;
diff --git a/vkh b/vkh
index 27fad24142f4cfbbc2e0069bf0446f2f9fafa345..6c5d18209e6050a1b5ce7cf8d03dc602dc1b7d2c 160000 (submodule)
--- a/vkh
+++ b/vkh
@@ -1 +1 @@
-Subproject commit 27fad24142f4cfbbc2e0069bf0446f2f9fafa345
+Subproject commit 6c5d18209e6050a1b5ce7cf8d03dc602dc1b7d2c