From 8faa6231db51327b3a39cf5ce2c2e4ff982b10fd Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sun, 8 May 2016 09:37:27 +0200 Subject: [PATCH 1/8] Fix some warnings. --- Makefile.common | 2 +- libretro-common/formats/jpeg/rjpeg.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.common b/Makefile.common index 154ffdc4bf..7ea3441a0f 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1014,7 +1014,7 @@ ifeq ($(HAVE_FFMPEG), 1) cores/libretro-ffmpeg/ffmpeg_core.o LIBS += $(AVCODEC_LIBS) $(AVFORMAT_LIBS) $(AVUTIL_LIBS) $(SWSCALE_LIBS) $(SWRESAMPLE_LIBS) $(FFMPEG_LIBS) DEFINES += $(AVCODEC_CFLAGS) $(AVFORMAT_CFLAGS) $(AVUTIL_CFLAGS) $(SWSCALE_CFLAGS) $(SWRESAMPLE_CFLAGS) - DEFINES += -DHAVE_FFMPEG -Iffmpeg + DEFINES += -Wno-deprecated-declarations -DHAVE_FFMPEG -Iffmpeg endif ifeq ($(HAVE_COMPRESSION), 1) diff --git a/libretro-common/formats/jpeg/rjpeg.c b/libretro-common/formats/jpeg/rjpeg.c index ddb6698be2..df45b8ffb5 100644 --- a/libretro-common/formats/jpeg/rjpeg.c +++ b/libretro-common/formats/jpeg/rjpeg.c @@ -429,7 +429,7 @@ static INLINE void rjpeg_decode_block( struct rjpeg_component *c, unsigned char* out) { - unsigned char code; + unsigned char code = 0; int coef = 0; memset(ctx->block, 0, sizeof(ctx->block)); From 26cfedc54611263b6505817ac38124f8bbfec302 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sun, 8 May 2016 09:54:36 +0200 Subject: [PATCH 2/8] Add XMB ribbon shaders to Vulkan. --- gfx/drivers/vulkan_shaders/ribbon.frag | 21 + gfx/drivers/vulkan_shaders/ribbon.frag.inc | 127 ++++++ gfx/drivers/vulkan_shaders/ribbon.vert | 52 +++ gfx/drivers/vulkan_shaders/ribbon.vert.inc | 430 ++++++++++++++++++ gfx/drivers/vulkan_shaders/ribbon_simple.frag | 8 + .../vulkan_shaders/ribbon_simple.frag.inc | 34 ++ gfx/drivers/vulkan_shaders/ribbon_simple.vert | 35 ++ .../vulkan_shaders/ribbon_simple.vert.inc | 342 ++++++++++++++ 8 files changed, 1049 insertions(+) create mode 100644 gfx/drivers/vulkan_shaders/ribbon.frag create mode 100644 gfx/drivers/vulkan_shaders/ribbon.frag.inc create mode 100644 gfx/drivers/vulkan_shaders/ribbon.vert create mode 100644 gfx/drivers/vulkan_shaders/ribbon.vert.inc create mode 100644 gfx/drivers/vulkan_shaders/ribbon_simple.frag create mode 100644 gfx/drivers/vulkan_shaders/ribbon_simple.frag.inc create mode 100644 gfx/drivers/vulkan_shaders/ribbon_simple.vert create mode 100644 gfx/drivers/vulkan_shaders/ribbon_simple.vert.inc diff --git a/gfx/drivers/vulkan_shaders/ribbon.frag b/gfx/drivers/vulkan_shaders/ribbon.frag new file mode 100644 index 0000000000..260730f10b --- /dev/null +++ b/gfx/drivers/vulkan_shaders/ribbon.frag @@ -0,0 +1,21 @@ +#version 310 es +precision mediump float; + +layout(std430, push_constant) uniform PushConstants +{ + float time; +} constants; + +layout(location = 0) in vec3 vEC; +layout(location = 0) out vec4 FragColor; + +void main() +{ + const vec3 up = vec3(0.0, 0.0, 1.0); + vec3 x = dFdx(vEC); + vec3 y = dFdy(vEC); + vec3 normal = normalize(cross(x, y)); + float c = 1.0 - dot(normal, up); + c = (1.0 - cos(c * c)) / 3.0; + FragColor = vec4(1.0, 1.0, 1.0, c); +} diff --git a/gfx/drivers/vulkan_shaders/ribbon.frag.inc b/gfx/drivers/vulkan_shaders/ribbon.frag.inc new file mode 100644 index 0000000000..f93eeb2841 --- /dev/null +++ b/gfx/drivers/vulkan_shaders/ribbon.frag.inc @@ -0,0 +1,127 @@ +unsigned char ribbon_frag_spv[] = { + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, + 0x2d, 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, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, 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, 0x78, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x76, 0x45, 0x43, 0x00, + 0x05, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x06, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x50, 0x75, 0x73, 0x68, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x69, 0x6d, 0x65, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x73, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x03, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x04, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x22, 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, + 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x17, 0x00, 0x04, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x26, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x03, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x09, 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, + 0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0xd0, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x94, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x07, 0x00, 0x25, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00 +}; +unsigned int ribbon_frag_spv_len = 1488; diff --git a/gfx/drivers/vulkan_shaders/ribbon.vert b/gfx/drivers/vulkan_shaders/ribbon.vert new file mode 100644 index 0000000000..9414c13d31 --- /dev/null +++ b/gfx/drivers/vulkan_shaders/ribbon.vert @@ -0,0 +1,52 @@ +#version 310 es + +layout(location = 0) in vec3 VertexCoord; +layout(location = 0) out vec3 vEC; + +layout(std430, push_constant) uniform PushConstants +{ + float time; +} constants; + +float iqhash(float n) +{ + return fract(sin(n) * 43758.5453); +} + +float noise(vec3 x) +{ + vec3 p = floor(x); + vec3 f = fract(x); + f = f * f * (3.0 - 2.0 * f); + float n = p.x + p.y * 57.0 + 113.0 * p.z; + return mix(mix(mix(iqhash(n), iqhash(n + 1.0), f.x), + mix(iqhash(n + 57.0), iqhash(n + 58.0), f.x), f.y), + mix(mix(iqhash(n + 113.0), iqhash(n + 114.0), f.x), + mix(iqhash(n + 170.0), iqhash(n + 171.0), f.x), f.y), f.z); +} + +float xmb_noise2(vec3 x) +{ + return cos(x.z * 2.0); +} + +void main() +{ + vec3 v = vec3(VertexCoord.x, 0.0, VertexCoord.y); + vec3 v2 = v; + vec3 v3 = v; + + v.y = xmb_noise2(v2) / 6.0; + + v3.x += constants.time / 5.0; + v3.x /= 2.0; + + v3.z += constants.time / 10.0; + v3.y += constants.time / 100.0; + + v.z += noise(v3 * 7.0) / 15.0; + v.y += noise(v3 * 7.0) / 15.0 + cos(v.x * 2.0 - constants.time / 5.0) / 5.0 - 0.3; + + vEC = v; + gl_Position = vec4(v, 1.0); +} diff --git a/gfx/drivers/vulkan_shaders/ribbon.vert.inc b/gfx/drivers/vulkan_shaders/ribbon.vert.inc new file mode 100644 index 0000000000..39f62ae249 --- /dev/null +++ b/gfx/drivers/vulkan_shaders/ribbon.vert.inc @@ -0,0 +1,430 @@ +unsigned char ribbon_vert_spv[] = { + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, + 0xe2, 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, + 0x80, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x69, 0x71, 0x68, 0x61, 0x73, 0x68, 0x28, 0x66, 0x31, 0x3b, 0x00, 0x00, + 0x05, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x69, 0x73, + 0x65, 0x28, 0x76, 0x66, 0x33, 0x3b, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x78, 0x6d, 0x62, 0x5f, 0x6e, 0x6f, 0x69, 0x73, + 0x65, 0x32, 0x28, 0x76, 0x66, 0x33, 0x3b, 0x00, 0x05, 0x00, 0x03, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x43, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x4a, 0x00, 0x00, 0x00, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x4f, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x59, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x5e, 0x00, 0x00, 0x00, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x66, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x76, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x00, + 0x05, 0x00, 0x03, 0x00, 0x88, 0x00, 0x00, 0x00, 0x76, 0x32, 0x00, 0x00, + 0x05, 0x00, 0x03, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x76, 0x33, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x92, 0x00, 0x00, 0x00, + 0x50, 0x75, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x73, 0x00, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00, 0x92, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x69, 0x6d, 0x65, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x94, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, + 0xb7, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0xd5, 0x00, 0x00, 0x00, + 0x76, 0x45, 0x43, 0x00, 0x05, 0x00, 0x06, 0x00, 0xd8, 0x00, 0x00, 0x00, + 0x67, 0x6c, 0x5f, 0x50, 0x65, 0x72, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0xd8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x00, 0x06, 0x00, 0x07, 0x00, 0xd8, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, + 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x05, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x94, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x04, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0xd8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x05, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0xd8, 0x00, 0x00, 0x00, 0x02, 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, 0x20, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x8c, 0xee, 0x2a, 0x47, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x15, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x2d, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x64, 0x42, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x42, 0x2b, 0x00, 0x04, 0x00, + 0x2d, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x42, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x42, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2a, 0x43, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x43, 0x20, 0x00, 0x04, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x81, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x40, 0x1e, 0x00, 0x03, 0x00, 0x92, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x93, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x93, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x04, 0x00, 0x95, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x95, 0x00, 0x00, 0x00, + 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x97, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa0, 0x40, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x42, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x40, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x41, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x99, 0x3e, + 0x20, 0x00, 0x04, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0xd4, 0x00, 0x00, 0x00, + 0xd5, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, + 0xd7, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x04, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0xd9, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0xd9, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xd7, 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, + 0x0d, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x8a, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0xc1, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x81, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x81, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x50, 0x00, 0x06, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x88, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x8b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x8d, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x90, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x91, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x97, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, + 0x96, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x99, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, + 0x9a, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x9c, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, + 0x9c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x9e, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, + 0x8a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x9f, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xa1, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xa3, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x97, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, + 0x94, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, + 0xa5, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xa9, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, + 0xa7, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xab, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0xab, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x97, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, + 0x94, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, + 0xad, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xb1, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, + 0xaf, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xb3, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0xb3, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x8a, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0xb6, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0xb7, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xbb, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, + 0xbb, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xbd, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0xbe, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x8e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0xc1, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xc1, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xc3, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, + 0xc5, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x97, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, + 0x96, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xc8, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, + 0x9a, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xca, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0xcb, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xcf, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, + 0xd1, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xd3, 0x00, 0x00, 0x00, + 0xd2, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0xd6, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0xd5, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xde, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x07, 0x00, 0xd7, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, + 0xdc, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0xe1, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0xe1, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, + 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0xfe, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00, + 0x36, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x4f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x35, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x3d, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x43, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x4a, 0x00, 0x00, 0x00, + 0x49, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x4b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x4e, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x56, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x59, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x5e, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x5e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x5a, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x66, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x6b, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x6b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x6d, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x6d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x6f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x67, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, + 0x6f, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x74, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, + 0x74, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, 0x75, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x37, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0xf8, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x79, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x7b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x7a, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, 0x7b, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x01, 0x00 +}; +unsigned int ribbon_vert_spv_len = 5116; diff --git a/gfx/drivers/vulkan_shaders/ribbon_simple.frag b/gfx/drivers/vulkan_shaders/ribbon_simple.frag new file mode 100644 index 0000000000..75f95020f7 --- /dev/null +++ b/gfx/drivers/vulkan_shaders/ribbon_simple.frag @@ -0,0 +1,8 @@ +#version 310 es +precision mediump float; + +layout(location = 0) out vec4 FragColor; +void main() +{ + FragColor = vec4(1.0, 1.0, 1.0, 0.05); +} diff --git a/gfx/drivers/vulkan_shaders/ribbon_simple.frag.inc b/gfx/drivers/vulkan_shaders/ribbon_simple.frag.inc new file mode 100644 index 0000000000..d1280b3427 --- /dev/null +++ b/gfx/drivers/vulkan_shaders/ribbon_simple.frag.inc @@ -0,0 +1,34 @@ +unsigned char ribbon_simple_frag_spv[] = { + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, + 0x0d, 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, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x36, 0x01, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, + 0x72, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x09, 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, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xcd, 0xcc, 0x4c, 0x3d, + 0x2c, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x0b, 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, 0x3e, 0x00, 0x03, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, + 0x38, 0x00, 0x01, 0x00 +}; +unsigned int ribbon_simple_frag_spv_len = 364; diff --git a/gfx/drivers/vulkan_shaders/ribbon_simple.vert b/gfx/drivers/vulkan_shaders/ribbon_simple.vert new file mode 100644 index 0000000000..5758c9f39e --- /dev/null +++ b/gfx/drivers/vulkan_shaders/ribbon_simple.vert @@ -0,0 +1,35 @@ +#version 310 es + +layout(location = 0) in vec3 VertexCoord; + +layout(std430, push_constant) uniform PushConstants +{ + float time; +} constants; + +float iqhash(float n) +{ + return fract(sin(n) * 43758.5453); +} + +float noise(vec3 x) +{ + vec3 p = floor(x); + vec3 f = fract(x); + f = f * f * (3.0 - 2.0 * f); + float n = p.x + p.y * 57.0 + 113.0 * p.z; + return mix(mix(mix(iqhash(n), iqhash(n + 1.0), f.x), + mix(iqhash(n + 57.0), iqhash(n + 58.0), f.x), f.y), + mix(mix(iqhash(n + 113.0), iqhash(n + 114.0), f.x), + mix(iqhash(n + 170.0), iqhash(n + 171.0), f.x), f.y), f.z); +} + +void main() +{ + vec3 v = vec3(VertexCoord.x, 0.0, VertexCoord.y); + vec3 v2 = v; + v2.x = v2.x + constants.time / 2.0; + v2.z = v.z * 3.0; + v.y = -cos((v.x + v.z / 3.0 + constants.time) * 2.0) / 10.0 - noise(v2.xyz) / 4.0; + gl_Position = vec4(v, 1.0); +} diff --git a/gfx/drivers/vulkan_shaders/ribbon_simple.vert.inc b/gfx/drivers/vulkan_shaders/ribbon_simple.vert.inc new file mode 100644 index 0000000000..22463dfb38 --- /dev/null +++ b/gfx/drivers/vulkan_shaders/ribbon_simple.vert.inc @@ -0,0 +1,342 @@ +unsigned char ribbon_simple_vert_spv[] = { + 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, + 0xb2, 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, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x69, 0x71, 0x68, 0x61, + 0x73, 0x68, 0x28, 0x66, 0x31, 0x3b, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x69, 0x73, 0x65, 0x28, 0x76, 0x66, + 0x33, 0x3b, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x3a, 0x00, 0x00, 0x00, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x47, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x56, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x63, 0x00, 0x00, 0x00, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x03, 0x00, 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x77, 0x00, 0x00, 0x00, 0x56, 0x65, 0x72, 0x74, + 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x00, 0x05, 0x00, 0x03, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x76, 0x32, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, + 0x83, 0x00, 0x00, 0x00, 0x50, 0x75, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00, + 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x69, 0x6d, 0x65, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x85, 0x00, 0x00, 0x00, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x04, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x67, 0x6c, 0x5f, 0x50, 0x65, 0x72, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x00, 0x06, 0x00, 0x07, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, + 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x05, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x83, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x85, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x05, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, + 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x02, 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, + 0x20, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x8c, 0xee, 0x2a, 0x47, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0x00, 0x04, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x42, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe2, 0x42, 0x2b, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x68, 0x42, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x42, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x43, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2b, 0x43, 0x20, 0x00, 0x04, 0x00, 0x76, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x76, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x03, 0x00, + 0x83, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x84, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x86, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x88, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, + 0x17, 0x00, 0x04, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0xa7, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0xa9, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0xb0, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xa7, 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, 0x0d, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x78, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x7a, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x75, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x75, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x7f, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x89, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x89, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x8b, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x8d, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x8e, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, + 0x8e, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x90, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x91, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x93, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, + 0x35, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x95, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x97, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x88, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, + 0x97, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x9c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x9b, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x9d, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, + 0x9e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0xa1, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0xa0, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xa0, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xa4, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, + 0x9f, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xa6, 0x00, 0x00, 0x00, + 0xa5, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0xab, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xad, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, + 0xab, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, + 0xa7, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, + 0xad, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, + 0xaa, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0xb1, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, + 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x37, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0xf8, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x56, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x8e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x50, 0x00, 0x06, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x47, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, + 0x49, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x4e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, + 0x4e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x56, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x56, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x59, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x5b, 0x00, 0x00, 0x00, + 0x5a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x65, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x68, 0x00, 0x00, 0x00, + 0x67, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x69, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x69, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x72, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x53, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, + 0xfe, 0x00, 0x02, 0x00, 0x72, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00 +}; +unsigned int ribbon_simple_vert_spv_len = 4068; From 464a4add66fd85b5c403de1fa6e0b6779fa2b723 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sun, 8 May 2016 11:11:28 +0200 Subject: [PATCH 3/8] XMB ribbon works in Vulkan. --- gfx/common/vulkan_common.c | 82 +- gfx/common/vulkan_common.h | 6 +- gfx/drivers/vulkan.c | 64 +- gfx/drivers/vulkan_shaders/ribbon.frag | 4 +- gfx/drivers/vulkan_shaders/ribbon.frag.inc | 48 +- gfx/drivers/vulkan_shaders/ribbon.vert | 3 +- gfx/drivers/vulkan_shaders/ribbon.vert.inc | 749 +++++++++--------- gfx/drivers/vulkan_shaders/ribbon_simple.vert | 4 +- .../vulkan_shaders/ribbon_simple.vert.inc | 581 +++++++------- gfx/drivers_font/vulkan_raster_font.c | 1 + menu/drivers/materialui.c | 3 + menu/drivers/xmb.c | 8 +- menu/drivers/zarch.c | 1 + menu/drivers_display/menu_display_vulkan.c | 74 +- menu/menu_display.h | 1 + 15 files changed, 861 insertions(+), 768 deletions(-) diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index dcddc15823..4bd77e93c9 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -523,14 +523,9 @@ static void vulkan_write_quad_descriptors( const struct vk_texture *texture, VkSampler sampler) { - VkDescriptorImageInfo image_info; VkDescriptorBufferInfo buffer_info; VkWriteDescriptorSet write = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET }; - image_info.sampler = sampler; - image_info.imageView = texture->view; - image_info.imageLayout = texture->layout; - buffer_info.buffer = buffer; buffer_info.offset = offset; buffer_info.range = range; @@ -542,12 +537,21 @@ static void vulkan_write_quad_descriptors( write.pBufferInfo = &buffer_info; VKFUNC(vkUpdateDescriptorSets)(device, 1, &write, 0, NULL); - write.dstSet = set; - write.dstBinding = 1; - write.descriptorCount = 1; - write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - write.pImageInfo = &image_info; - VKFUNC(vkUpdateDescriptorSets)(device, 1, &write, 0, NULL); + if (texture) + { + VkDescriptorImageInfo image_info; + + image_info.sampler = sampler; + image_info.imageView = texture->view; + image_info.imageLayout = texture->layout; + + write.dstSet = set; + write.dstBinding = 1; + write.descriptorCount = 1; + write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + write.pImageInfo = &image_info; + VKFUNC(vkUpdateDescriptorSets)(device, 1, &write, 0, NULL); + } } void vulkan_transition_texture(vk_t *vk, struct vk_texture *texture) @@ -606,7 +610,8 @@ static void vulkan_check_dynamic_state( void vulkan_draw_triangles(vk_t *vk, const struct vk_draw_triangles *call) { - vulkan_transition_texture(vk, call->texture); + if (call->texture) + vulkan_transition_texture(vk, call->texture); if (call->pipeline != vk->tracker.pipeline) { @@ -624,37 +629,34 @@ void vulkan_draw_triangles(vk_t *vk, const struct vk_draw_triangles *call) { VkDescriptorSet set; - if (memcmp(call->mvp, &vk->tracker.mvp, sizeof(*call->mvp)) - || (call->texture->view != vk->tracker.view) - || (call->sampler != vk->tracker.sampler)) - { - /* Upload UBO */ - struct vk_buffer_range range; - if (!vulkan_buffer_chain_alloc(vk->context, &vk->chain->ubo, - sizeof(*call->mvp), &range)) - return; - memcpy(range.data, call->mvp, sizeof(*call->mvp)); + /* Upload UBO */ + struct vk_buffer_range range; + if (!vulkan_buffer_chain_alloc(vk->context, &vk->chain->ubo, + call->uniform_size, &range)) + return; - set = vulkan_descriptor_manager_alloc( - vk->context->device, - &vk->chain->descriptor_manager); - vulkan_write_quad_descriptors( - vk->context->device, - set, - range.buffer, - range.offset, - sizeof(*call->mvp), - call->texture, - call->sampler); + memcpy(range.data, call->uniform, call->uniform_size); - VKFUNC(vkCmdBindDescriptorSets)(vk->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, - vk->pipelines.layout, 0, - 1, &set, 0, NULL); + set = vulkan_descriptor_manager_alloc( + vk->context->device, + &vk->chain->descriptor_manager); - vk->tracker.view = call->texture->view; - vk->tracker.sampler = call->sampler; - vk->tracker.mvp = *call->mvp; - } + vulkan_write_quad_descriptors( + vk->context->device, + set, + range.buffer, + range.offset, + call->uniform_size, + call->texture, + call->sampler); + + VKFUNC(vkCmdBindDescriptorSets)(vk->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, + vk->pipelines.layout, 0, + 1, &set, 0, NULL); + + vk->tracker.view = VK_NULL_HANDLE; + vk->tracker.sampler = VK_NULL_HANDLE; + memset(&vk->tracker.mvp, 0, sizeof(vk->tracker.mvp)); } /* VBO is already uploaded. */ diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 6a46bb84d1..02961f8e83 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -249,7 +249,9 @@ struct vk_draw_triangles VkPipeline pipeline; struct vk_texture *texture; VkSampler sampler; - const math_matrix_4x4 *mvp; + + const void *uniform; + size_t uniform_size; const struct vk_buffer_range *vbo; unsigned vertices; @@ -312,7 +314,7 @@ typedef struct vk struct { bool blend; - VkPipeline pipelines[4]; + VkPipeline pipelines[8]; struct vk_texture blank_texture; } display; diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index f330bd1c7b..e2bb1403d3 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -17,6 +17,10 @@ #include "vulkan_shaders/alpha_blend.vert.inc" #include "vulkan_shaders/alpha_blend.frag.inc" #include "vulkan_shaders/font.frag.inc" +#include "vulkan_shaders/ribbon.vert.inc" +#include "vulkan_shaders/ribbon.frag.inc" +#include "vulkan_shaders/ribbon_simple.vert.inc" +#include "vulkan_shaders/ribbon_simple.frag.inc" #include #include @@ -172,7 +176,7 @@ static void vulkan_init_pipeline_layout( bindings[0].binding = 0; bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; bindings[0].descriptorCount = 1; - bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; + bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT; bindings[0].pImmutableSamplers = NULL; bindings[1].binding = 1; @@ -360,6 +364,49 @@ static void vulkan_init_pipelines( VKFUNC(vkDestroyShaderModule)(vk->context->device, shader_stages[0].module, NULL); VKFUNC(vkDestroyShaderModule)(vk->context->device, shader_stages[1].module, NULL); + + /* Other menu pipelines. */ + for (i = 0; i < 4; i++) + { + if (i & 2) + { + module_info.codeSize = ribbon_simple_vert_spv_len; + module_info.pCode = (const uint32_t*)ribbon_simple_vert_spv; + } + else + { + module_info.codeSize = ribbon_vert_spv_len; + module_info.pCode = (const uint32_t*)ribbon_vert_spv; + } + + shader_stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT; + shader_stages[0].pName = "main"; + VKFUNC(vkCreateShaderModule)(vk->context->device, + &module_info, NULL, &shader_stages[0].module); + + if (i & 2) + { + module_info.codeSize = ribbon_simple_frag_spv_len; + module_info.pCode = (const uint32_t*)ribbon_simple_frag_spv; + } + else + { + module_info.codeSize = ribbon_frag_spv_len; + module_info.pCode = (const uint32_t*)ribbon_frag_spv; + } + + shader_stages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT; + shader_stages[1].pName = "main"; + VKFUNC(vkCreateShaderModule)(vk->context->device, + &module_info, NULL, &shader_stages[1].module); + + input_assembly.topology = i & 1 ? + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP : + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + + VKFUNC(vkCreateGraphicsPipelines)(vk->context->device, vk->pipelines.cache, + 1, &pipe, NULL, &vk->display.pipelines[4 + i]); + } } static void vulkan_init_command_buffers(vk_t *vk) @@ -550,7 +597,7 @@ static void vulkan_deinit_pipelines(vk_t *vk) VKFUNC(vkDestroyPipeline)(vk->context->device, vk->pipelines.font, NULL); - for (i = 0; i < 4; i++) + for (i = 0; i < 8; i++) VKFUNC(vkDestroyPipeline)(vk->context->device, vk->display.pipelines[i], NULL); } @@ -2146,12 +2193,13 @@ static void vulkan_render_overlay(vk_t *vk) 4 * sizeof(struct vk_vertex)); memset(&call, 0, sizeof(call)); - call.pipeline = vk->display.pipelines[3]; /* Strip with blend */ - call.texture = &vk->overlay.images[i]; - call.sampler = vk->samplers.linear; - call.mvp = &vk->mvp; - call.vbo = ⦥ - call.vertices = 4; + call.pipeline = vk->display.pipelines[3]; /* Strip with blend */ + call.texture = &vk->overlay.images[i]; + call.sampler = vk->samplers.linear; + call.uniform = &vk->mvp; + call.uniform_size = sizeof(vk->mvp); + call.vbo = ⦥ + call.vertices = 4; vulkan_draw_triangles(vk, &call); } diff --git a/gfx/drivers/vulkan_shaders/ribbon.frag b/gfx/drivers/vulkan_shaders/ribbon.frag index 260730f10b..1ae01f2528 100644 --- a/gfx/drivers/vulkan_shaders/ribbon.frag +++ b/gfx/drivers/vulkan_shaders/ribbon.frag @@ -1,7 +1,7 @@ #version 310 es -precision mediump float; +precision highp float; -layout(std430, push_constant) uniform PushConstants +layout(std140, set = 0, binding = 0) uniform UBO { float time; } constants; diff --git a/gfx/drivers/vulkan_shaders/ribbon.frag.inc b/gfx/drivers/vulkan_shaders/ribbon.frag.inc index f93eeb2841..a229f4a047 100644 --- a/gfx/drivers/vulkan_shaders/ribbon.frag.inc +++ b/gfx/drivers/vulkan_shaders/ribbon.frag.inc @@ -17,44 +17,18 @@ unsigned char ribbon_frag_spv[] = { 0x61, 0x6c, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x17, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x27, 0x00, 0x00, 0x00, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x06, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x50, 0x75, 0x73, 0x68, - 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x55, 0x42, 0x4f, 0x00, 0x06, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x69, 0x6d, 0x65, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, - 0x73, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x73, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x27, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x47, 0x00, 0x03, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x47, 0x00, 0x03, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x47, 0x00, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x47, 0x00, 0x04, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x05, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x04, 0x00, 0x2c, 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, @@ -76,9 +50,9 @@ unsigned char ribbon_frag_spv[] = { 0x25, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x26, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, - 0x2b, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x02, 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, 0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, @@ -124,4 +98,4 @@ unsigned char ribbon_frag_spv[] = { 0x28, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x27, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00 }; -unsigned int ribbon_frag_spv_len = 1488; +unsigned int ribbon_frag_spv_len = 1176; diff --git a/gfx/drivers/vulkan_shaders/ribbon.vert b/gfx/drivers/vulkan_shaders/ribbon.vert index 9414c13d31..eac9d2d121 100644 --- a/gfx/drivers/vulkan_shaders/ribbon.vert +++ b/gfx/drivers/vulkan_shaders/ribbon.vert @@ -3,7 +3,7 @@ layout(location = 0) in vec3 VertexCoord; layout(location = 0) out vec3 vEC; -layout(std430, push_constant) uniform PushConstants +layout(std140, set = 0, binding = 0) uniform UBO { float time; } constants; @@ -47,6 +47,7 @@ void main() v.z += noise(v3 * 7.0) / 15.0; v.y += noise(v3 * 7.0) / 15.0 + cos(v.x * 2.0 - constants.time / 5.0) / 5.0 - 0.3; + v.y = -v.y; vEC = v; gl_Position = vec4(v, 1.0); } diff --git a/gfx/drivers/vulkan_shaders/ribbon.vert.inc b/gfx/drivers/vulkan_shaders/ribbon.vert.inc index 39f62ae249..7531c5cf20 100644 --- a/gfx/drivers/vulkan_shaders/ribbon.vert.inc +++ b/gfx/drivers/vulkan_shaders/ribbon.vert.inc @@ -1,12 +1,12 @@ unsigned char ribbon_vert_spv[] = { 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, - 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, + 0xe6, 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, - 0x80, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00, @@ -37,394 +37,401 @@ unsigned char ribbon_vert_spv[] = { 0x05, 0x00, 0x03, 0x00, 0x88, 0x00, 0x00, 0x00, 0x76, 0x32, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x76, 0x33, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x92, 0x00, 0x00, 0x00, - 0x50, 0x75, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, - 0x73, 0x00, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00, 0x92, 0x00, 0x00, 0x00, + 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x92, 0x00, 0x00, 0x00, + 0x55, 0x42, 0x4f, 0x00, 0x06, 0x00, 0x05, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x69, 0x6d, 0x65, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x94, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0xd5, 0x00, 0x00, 0x00, - 0x76, 0x45, 0x43, 0x00, 0x05, 0x00, 0x06, 0x00, 0xd8, 0x00, 0x00, 0x00, + 0x6d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0xd9, 0x00, 0x00, 0x00, + 0x76, 0x45, 0x43, 0x00, 0x05, 0x00, 0x06, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x65, 0x72, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0xd8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x00, 0x06, 0x00, 0x07, 0x00, 0xd8, 0x00, 0x00, 0x00, + 0x69, 0x6f, 0x6e, 0x00, 0x06, 0x00, 0x07, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, - 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, + 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x94, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x47, 0x00, 0x04, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0xd8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x05, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, - 0xd8, 0x00, 0x00, 0x00, 0x02, 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, 0x20, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x8c, 0xee, 0x2a, 0x47, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x2b, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x15, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, - 0x2d, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x64, 0x42, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x42, 0x2b, 0x00, 0x04, 0x00, - 0x2d, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x3f, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x42, 0x2b, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x42, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2a, 0x43, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x43, 0x20, 0x00, 0x04, 0x00, - 0x7f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x81, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x40, 0x1e, 0x00, 0x03, 0x00, 0x92, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x93, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x93, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x15, 0x00, 0x04, 0x00, 0x95, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x95, 0x00, 0x00, 0x00, - 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, - 0x97, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x40, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x2b, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x42, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x40, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x41, 0x2b, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0x9a, 0x99, 0x99, 0x3e, - 0x20, 0x00, 0x04, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0xd4, 0x00, 0x00, 0x00, - 0xd5, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, - 0xd7, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x04, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0xd9, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0xd9, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x04, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0xd7, 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, - 0x0d, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x04, 0x00, 0x94, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0xd9, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, + 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x03, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x02, 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, 0x20, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x21, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x21, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x8c, 0xee, 0x2a, 0x47, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x15, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x2d, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x42, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x42, + 0x2b, 0x00, 0x04, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x42, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe4, 0x42, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x43, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x43, + 0x20, 0x00, 0x04, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x7f, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x81, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x1e, 0x00, 0x03, 0x00, + 0x92, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0x93, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x93, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x95, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x95, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x97, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x40, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc8, 0x42, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x40, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x41, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, + 0x9a, 0x99, 0x99, 0x3e, 0x20, 0x00, 0x04, 0x00, 0xd8, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0xd8, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x04, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0xdb, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0xdd, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0xe4, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0xdb, 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, 0x0d, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x8a, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0xc1, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x81, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x83, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x81, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x86, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x50, 0x00, 0x06, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, - 0x84, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x7e, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x88, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, - 0x7e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x8a, 0x00, 0x00, 0x00, - 0x8b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x8d, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x8c, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x8c, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x90, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, - 0x7e, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x91, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x97, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, - 0x96, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x99, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, - 0x9a, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x9c, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, - 0x9c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x9e, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, - 0x8a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x9f, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xa1, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, - 0x26, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0xa3, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x97, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, + 0xb7, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x81, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x81, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x89, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x8b, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, + 0x8f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x91, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x97, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, - 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, - 0xa5, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, + 0x99, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x9d, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, + 0x9b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x9f, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, + 0x8a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, + 0xa1, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xa3, 0x00, 0x00, 0x00, + 0xa2, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x97, 0x00, 0x00, 0x00, + 0xa4, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, + 0xa4, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xa7, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x8a, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, + 0xa9, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xab, 0x00, 0x00, 0x00, + 0xaa, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x97, 0x00, 0x00, 0x00, + 0xac, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, + 0xac, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xaf, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, + 0x8a, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, + 0xb1, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xb3, 0x00, 0x00, 0x00, + 0xb2, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0xb4, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0xb5, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xb7, 0x00, 0x00, 0x00, + 0xb6, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xb8, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, + 0xb8, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xa9, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, - 0xa7, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0xab, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0xab, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x97, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, - 0x94, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, - 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, - 0xad, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, - 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xb1, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, - 0xaf, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0xb3, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0xb3, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0xbc, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, + 0xba, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xbe, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0xb6, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0xb7, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, - 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0xc1, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0xbb, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, - 0xbb, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xbd, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, - 0x7e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0xbe, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, - 0x8e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, - 0xbf, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0xc1, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0xc1, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xc3, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, - 0x7e, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, - 0xc5, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x97, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, - 0x96, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xc8, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, - 0x9a, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xca, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, - 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, - 0xcb, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, - 0xcc, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xcf, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, - 0x7e, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, - 0xd1, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, - 0x31, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xd3, 0x00, 0x00, 0x00, - 0xd2, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0xd6, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0xd5, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, - 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, - 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xde, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x07, 0x00, 0xd7, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, - 0xdc, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0xe0, 0x00, 0x00, 0x00, - 0xe1, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0xe1, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, - 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x15, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0xfe, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00, - 0x36, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x1c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x4f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x66, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x1d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x25, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, - 0x83, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, - 0x29, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, - 0x2a, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x1f, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x2f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x2f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x32, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, - 0x32, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, - 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, - 0x3a, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x3d, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x3f, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x42, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x43, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, - 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x46, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, - 0x46, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x34, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x4a, 0x00, 0x00, 0x00, - 0x49, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x4b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x4e, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, - 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x56, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x47, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x58, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x59, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, - 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, - 0x5b, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x5e, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x5e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x66, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, - 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, - 0x68, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x6b, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x6b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x6d, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, - 0x6d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x6f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x67, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, - 0x6f, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, - 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x74, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, - 0x74, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, 0x75, 0x00, 0x00, 0x00, + 0xc4, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, + 0xc4, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xc6, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x97, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, + 0x94, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, + 0xc8, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, + 0xc9, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xcb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0xca, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, + 0xc3, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, + 0xce, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0xd0, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, + 0xd0, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xd2, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0xd3, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xd5, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0xd7, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0xd9, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, + 0xdf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0xdb, 0x00, 0x00, 0x00, + 0xe3, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, + 0xe2, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0xe4, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, + 0x96, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xe5, 0x00, 0x00, 0x00, + 0xe3, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, + 0x36, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, 0x19, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x37, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0xf8, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x79, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, - 0x26, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x7b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x7a, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, 0x7b, 0x00, 0x00, 0x00, - 0x38, 0x00, 0x01, 0x00 + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x37, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0xf8, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x4a, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x5e, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x50, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, + 0x37, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x43, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x4a, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x4a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x4d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x4f, 0x00, 0x00, 0x00, + 0x4e, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x57, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, + 0x37, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x59, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x5a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x5d, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x61, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, + 0x61, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x65, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x67, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x6a, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, + 0x6e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x72, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x62, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, + 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, + 0x75, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, + 0x79, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, + 0x7b, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00 }; -unsigned int ribbon_vert_spv_len = 5116; +unsigned int ribbon_vert_spv_len = 5204; diff --git a/gfx/drivers/vulkan_shaders/ribbon_simple.vert b/gfx/drivers/vulkan_shaders/ribbon_simple.vert index 5758c9f39e..89083e222c 100644 --- a/gfx/drivers/vulkan_shaders/ribbon_simple.vert +++ b/gfx/drivers/vulkan_shaders/ribbon_simple.vert @@ -2,7 +2,7 @@ layout(location = 0) in vec3 VertexCoord; -layout(std430, push_constant) uniform PushConstants +layout(std140, set = 0, binding = 0) uniform UBO { float time; } constants; @@ -31,5 +31,5 @@ void main() v2.x = v2.x + constants.time / 2.0; v2.z = v.z * 3.0; v.y = -cos((v.x + v.z / 3.0 + constants.time) * 2.0) / 10.0 - noise(v2.xyz) / 4.0; - gl_Position = vec4(v, 1.0); + gl_Position = vec4(v.x, -v.y, v.z, 1.0); } diff --git a/gfx/drivers/vulkan_shaders/ribbon_simple.vert.inc b/gfx/drivers/vulkan_shaders/ribbon_simple.vert.inc index 22463dfb38..3c7516f652 100644 --- a/gfx/drivers/vulkan_shaders/ribbon_simple.vert.inc +++ b/gfx/drivers/vulkan_shaders/ribbon_simple.vert.inc @@ -1,6 +1,6 @@ unsigned char ribbon_simple_vert_spv[] = { 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, - 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, + 0xb5, 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, @@ -31,9 +31,8 @@ unsigned char ribbon_simple_vert_spv[] = { 0x05, 0x00, 0x03, 0x00, 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x77, 0x00, 0x00, 0x00, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x00, 0x05, 0x00, 0x03, 0x00, - 0x7f, 0x00, 0x00, 0x00, 0x76, 0x32, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, - 0x83, 0x00, 0x00, 0x00, 0x50, 0x75, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x76, 0x32, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, + 0x83, 0x00, 0x00, 0x00, 0x55, 0x42, 0x4f, 0x00, 0x06, 0x00, 0x05, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x69, 0x6d, 0x65, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x85, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0x00, 0x00, @@ -51,292 +50,298 @@ unsigned char ribbon_simple_vert_spv[] = { 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x83, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x85, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x05, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, - 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0xa8, 0x00, 0x00, 0x00, - 0x02, 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, - 0x20, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x8c, 0xee, 0x2a, 0x47, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x40, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0x00, 0x04, 0x00, - 0x2a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x47, 0x00, 0x04, 0x00, 0x85, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x05, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, + 0xa8, 0x00, 0x00, 0x00, 0x02, 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, 0x20, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x8c, 0xee, 0x2a, 0x47, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x15, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x42, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe2, 0x42, 0x2b, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, - 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x68, 0x42, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x42, 0x2b, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x43, - 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2b, 0x43, 0x20, 0x00, 0x04, 0x00, 0x76, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x76, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x03, 0x00, - 0x83, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, - 0x84, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x84, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x86, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, - 0x86, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x04, 0x00, 0x88, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x2b, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, - 0x17, 0x00, 0x04, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0x00, 0xa8, 0x00, 0x00, 0x00, - 0xa7, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, - 0xa9, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0xb0, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0xa7, 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, 0x0d, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x7f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x78, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, - 0x77, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, - 0x77, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, - 0x7a, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x75, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x75, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x7f, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x88, 0x00, 0x00, 0x00, - 0x89, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, - 0x89, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x8b, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, - 0x82, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x8d, 0x00, 0x00, 0x00, - 0x8c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x8e, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, - 0x8e, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x90, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, - 0x7f, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x91, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x64, 0x42, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x42, 0x2b, 0x00, 0x04, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3f, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x42, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x42, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2a, 0x43, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x43, 0x20, 0x00, 0x04, 0x00, + 0x76, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x76, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x03, 0x00, 0x83, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x84, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x04, 0x00, 0x86, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, + 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x40, 0x17, 0x00, 0x04, 0x00, 0xa7, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x04, 0x00, + 0xa8, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x04, 0x00, 0xa9, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xa8, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0xa9, 0x00, 0x00, 0x00, + 0xaa, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, + 0xb3, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa7, 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, 0x0d, 0x00, 0x00, 0x00, + 0x75, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x79, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, + 0x79, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x7c, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, + 0x7c, 0x00, 0x00, 0x00, 0x50, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, + 0x7d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x75, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x93, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, + 0x82, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, + 0x87, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x8a, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, + 0x7f, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x8d, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x95, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x97, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x88, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, - 0x97, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, - 0x23, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x9c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x9b, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x9d, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, - 0x9e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0xa1, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0xa0, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0xa0, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xa4, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, - 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, - 0x9f, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0xa6, 0x00, 0x00, 0x00, - 0xa5, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0xab, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0xad, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, - 0xab, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, - 0xa7, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, - 0xad, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, - 0xaa, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0xb1, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, - 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x37, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0xf8, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x1c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x56, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x68, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x1d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, - 0x8e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x50, 0x00, 0x06, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, - 0x25, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, - 0x32, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x36, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, - 0x36, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x38, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, - 0x33, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x29, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, - 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x42, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, - 0x42, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x3c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, - 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x46, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, - 0x3e, 0x00, 0x03, 0x00, 0x47, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, - 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, - 0x49, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x4c, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x4c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x4e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, - 0x4e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, - 0x1c, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x54, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x56, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x56, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x58, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, - 0x59, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x5b, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x5c, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, - 0x1c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, - 0x5c, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, - 0x63, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x63, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x65, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, - 0x66, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x68, 0x00, 0x00, 0x00, - 0x67, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x69, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, - 0x1c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, - 0x69, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x8f, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x91, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x91, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, + 0x75, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, + 0x75, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x95, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, + 0x96, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x98, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, + 0x98, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x9a, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, + 0x9a, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, + 0x9d, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, + 0xa3, 0x00, 0x00, 0x00, 0x83, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xa5, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, + 0x75, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0xa6, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0xac, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x6e, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x2e, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, - 0x6e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, - 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x72, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, - 0x53, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, - 0xfe, 0x00, 0x02, 0x00, 0x72, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00 + 0xae, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, + 0x75, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x07, 0x00, 0xa7, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, + 0xac, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0xb3, 0x00, 0x00, 0x00, + 0xb4, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, + 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00, 0x36, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0xfe, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x00, 0x38, 0x00, 0x01, 0x00, + 0x36, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3a, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x06, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x06, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x26, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x2d, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x35, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x37, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x37, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x29, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x3a, 0x00, 0x00, 0x00, + 0x3b, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x43, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x43, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x45, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x47, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x4b, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x4f, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, + 0x4f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x51, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, + 0x51, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x56, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x5d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, + 0x5d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x57, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x62, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x03, 0x00, 0x63, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, + 0x39, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, + 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x39, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x6a, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, + 0x6a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x6c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, + 0x41, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, + 0x6c, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x35, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x71, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, + 0x71, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x02, 0x00, 0x72, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x01, 0x00 }; -unsigned int ribbon_simple_vert_spv_len = 4068; +unsigned int ribbon_simple_vert_spv_len = 4120; diff --git a/gfx/drivers_font/vulkan_raster_font.c b/gfx/drivers_font/vulkan_raster_font.c index 46336e1e9d..40db815f6d 100644 --- a/gfx/drivers_font/vulkan_raster_font.c +++ b/gfx/drivers_font/vulkan_raster_font.c @@ -243,6 +243,7 @@ static void vulkan_raster_font_flush(vulkan_raster_t *font) &font->texture, font->vk->samplers.nearest, &font->vk->mvp, + sizeof(font->vk->mvp), &font->range, font->vertices, }; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index f23b4df9ba..efdf5a7c41 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -205,6 +205,7 @@ static void mui_draw_icon( draw.matrix_data = &mymat; draw.texture = texture; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; + draw.pipeline.id = 0; menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); @@ -294,6 +295,7 @@ static void mui_render_quad(mui_handle_t *mui, draw.matrix_data = NULL; draw.texture = menu_display_white_texture; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; + draw.pipeline.id = 0; menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); @@ -712,6 +714,7 @@ static void mui_draw_bg(menu_display_ctx_draw_t *draw) menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); draw->x = 0; draw->y = 0; + draw->pipeline.id = 0; menu_display_ctl(MENU_DISPLAY_CTL_DRAW_BG, draw); menu_display_ctl(MENU_DISPLAY_CTL_DRAW, draw); menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 6f1f91f54f..3bafb72c4c 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -498,6 +498,7 @@ static void xmb_draw_icon( draw.matrix_data = mymat; draw.texture = texture; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; + draw.pipeline.id = 0; if (settings->menu.xmb_shadows_enable) { @@ -554,6 +555,7 @@ static void xmb_draw_thumbnail(xmb_handle_t *xmb, float *color, draw.matrix_data = &mymat; draw.texture = xmb->thumbnail; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; + draw.pipeline.id = 0; if (settings->menu.xmb_shadows_enable) { @@ -1943,6 +1945,7 @@ static void xmb_draw_bg( draw.tex_coord = NULL; draw.vertex_count = 4; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; + draw.pipeline.id = 0; menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); menu_display_ctl(MENU_DISPLAY_CTL_SET_VIEWPORT, NULL); @@ -1956,11 +1959,12 @@ static void xmb_draw_bg( else menu_display_set_alpha(draw.color, coord_white[3]); + menu_display_ctl(MENU_DISPLAY_CTL_DRAW_GRADIENT, &draw); + draw.pipeline.id = VIDEO_SHADER_MENU_SEC; if (settings->menu.shader_pipeline == 2) draw.pipeline.id = VIDEO_SHADER_MENU; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW_GRADIENT, &draw); menu_display_ctl(MENU_DISPLAY_CTL_DRAW_PIPELINE, &draw); } else @@ -1981,7 +1985,6 @@ static void xmb_draw_dark_layer( unsigned width, unsigned height) { - menu_display_ctx_draw_t draw; struct gfx_coords coords; float black[16] = { @@ -2007,6 +2010,7 @@ static void xmb_draw_dark_layer( draw.matrix_data = NULL; draw.texture = menu_display_white_texture; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; + draw.pipeline.id = 0; menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); diff --git a/menu/drivers/zarch.c b/menu/drivers/zarch.c index b6f8dca2c4..8a2a783040 100644 --- a/menu/drivers/zarch.c +++ b/menu/drivers/zarch.c @@ -954,6 +954,7 @@ static void zarch_frame(void *data) draw.matrix_data = &zui->mvp; draw.texture = menu_display_white_texture; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLES; + draw.pipeline.id = 0; menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); diff --git a/menu/drivers_display/menu_display_vulkan.c b/menu/drivers_display/menu_display_vulkan.c index 04d2c2deed..8c8142174e 100644 --- a/menu/drivers_display/menu_display_vulkan.c +++ b/menu/drivers_display/menu_display_vulkan.c @@ -20,6 +20,7 @@ #include "../../gfx/font_driver.h" #include "../../gfx/video_context_driver.h" #include "../../gfx/common/vulkan_common.h" +#include "../../gfx/video_shader_driver.h" #include "../menu_display.h" @@ -61,6 +62,20 @@ static unsigned to_display_pipeline( return ((type == MENU_DISPLAY_PRIM_TRIANGLESTRIP) << 1) | (blend << 0); } +static unsigned to_menu_pipeline( + enum menu_display_prim_type type, unsigned pipeline) +{ + switch (pipeline) + { + case VIDEO_SHADER_MENU: + return 4 + (type == MENU_DISPLAY_PRIM_TRIANGLESTRIP); + case VIDEO_SHADER_MENU_SEC: + return 6 + (type == MENU_DISPLAY_PRIM_TRIANGLESTRIP); + default: + return 0; + } +} + static void menu_display_vk_viewport(void *data) { menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; @@ -81,14 +96,20 @@ static void menu_display_vk_draw_pipeline(void *data) { menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; vk_t *vk = (vk_t*)video_driver_get_ptr(false); + gfx_coord_array_t *ca = NULL; + static float t = 0.0f; if (!vk || !draw) return; - (void)draw; - (void)vk; + menu_display_ctl(MENU_DISPLAY_CTL_COORDS_ARRAY_GET, &ca); + draw->x = 0; + draw->y = 0; + draw->coords = (struct gfx_coords*)&ca->coords; + draw->matrix_data = NULL; + draw->pipeline.backend_data = &t; - /* TODO/FIXME - to implement */ + t += 0.01; } static void menu_display_vk_draw(void *data) @@ -142,19 +163,42 @@ static void menu_display_vk_draw(void *data) pv->color.a = *color++; } + switch (draw->pipeline.id) { - const struct vk_draw_triangles call = { - vk->display.pipelines[ - to_display_pipeline(draw->prim_type, vk->display.blend)], - texture, - texture->default_smooth - ? vk->samplers.linear : vk->samplers.nearest, - draw->matrix_data ? (math_matrix_4x4*)draw->matrix_data - : (math_matrix_4x4*)menu_display_vk_get_default_mvp(), - &range, - draw->coords->vertices, - }; - vulkan_draw_triangles(vk, &call); + case VIDEO_SHADER_MENU: + case VIDEO_SHADER_MENU_SEC: + { + const struct vk_draw_triangles call = { + vk->display.pipelines[ + to_menu_pipeline(draw->prim_type, draw->pipeline.id)], + NULL, + VK_NULL_HANDLE, + draw->pipeline.backend_data, + sizeof(float), + &range, + draw->coords->vertices, + }; + vulkan_draw_triangles(vk, &call); + break; + } + + default: + { + const struct vk_draw_triangles call = { + vk->display.pipelines[ + to_display_pipeline(draw->prim_type, vk->display.blend)], + texture, + texture->default_smooth + ? vk->samplers.linear : vk->samplers.nearest, + draw->matrix_data + ? draw->matrix_data : menu_display_vk_get_default_mvp(), + sizeof(math_matrix_4x4), + &range, + draw->coords->vertices, + }; + vulkan_draw_triangles(vk, &call); + break; + } } } diff --git a/menu/menu_display.h b/menu/menu_display.h index a8c251c031..2fd55f8162 100644 --- a/menu/menu_display.h +++ b/menu/menu_display.h @@ -124,6 +124,7 @@ typedef struct menu_display_ctx_draw struct { unsigned id; + const void *backend_data; } pipeline; } menu_display_ctx_draw_t; From 951c3e408511b7fdf1915ef6fec9daaaaafce4fb Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sun, 8 May 2016 12:33:28 +0200 Subject: [PATCH 4/8] De-ioctl menu display interface. Holy crap ... --- command_event.c | 4 +- menu/cbs/menu_cbs_ok.c | 3 +- menu/drivers/materialui.c | 89 +-- menu/drivers/menu_generic.c | 2 +- menu/drivers/rgui.c | 84 +- menu/drivers/xmb.c | 82 +- menu/drivers/zarch.c | 50 +- menu/drivers_display/menu_display_gl.c | 2 +- menu/drivers_display/menu_display_vulkan.c | 2 +- menu/menu_content.c | 3 +- menu/menu_display.c | 861 ++++++++++----------- menu/menu_display.h | 112 +-- menu/menu_driver.c | 12 +- menu/menu_input.c | 8 +- 14 files changed, 624 insertions(+), 690 deletions(-) diff --git a/command_event.c b/command_event.c index 700ff718b0..e5906d5be2 100644 --- a/command_event.c +++ b/command_event.c @@ -1151,9 +1151,7 @@ bool event_cmd_ctl(enum event_command cmd, void *data) input_driver_ctl(RARCH_INPUT_CTL_POLL, NULL); #ifdef HAVE_MENU - menu_display_ctl( - MENU_DISPLAY_CTL_SET_FRAMEBUFFER_DIRTY_FLAG, NULL); - + menu_display_set_framebuffer_dirty_flag(); if (menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL)) event_cmd_ctl(EVENT_CMD_VIDEO_SET_BLOCKING_STATE, NULL); #endif diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index fba8fccd12..0b84e6e4b3 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -768,10 +768,9 @@ static int generic_action_ok(const char *path, break; case ACTION_OK_LOAD_CONFIG_FILE: { - bool msg_force = true; flush_char = NULL; flush_type = MENU_SETTINGS; - menu_display_ctl(MENU_DISPLAY_CTL_SET_MSG_FORCE, &msg_force); + menu_display_set_msg_force(true); if (rarch_ctl(RARCH_CTL_REPLACE_CONFIG, action_path)) { diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index efdf5a7c41..875d7c8e44 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -180,7 +180,7 @@ static void mui_draw_icon( struct gfx_coords coords; math_matrix_4x4 mymat; - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); + menu_display_blend_begin(); rotate_draw.matrix = &mymat; rotate_draw.rotation = rotation; @@ -189,7 +189,7 @@ static void mui_draw_icon( rotate_draw.scale_z = 1; rotate_draw.scale_enable = true; - menu_display_ctl(MENU_DISPLAY_CTL_ROTATE_Z, &rotate_draw); + menu_display_rotate_z(&rotate_draw); coords.vertices = 4; coords.vertex = NULL; @@ -207,12 +207,10 @@ static void mui_draw_icon( draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; draw.pipeline.id = 0; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); - - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); + menu_display_draw(&draw); + menu_display_blend_end(); } - static void mui_draw_tab(mui_handle_t *mui, unsigned i, unsigned width, unsigned height, @@ -256,7 +254,7 @@ static void mui_draw_text(float x, float y, unsigned width, unsigned height, int font_size; struct font_params params; - menu_display_ctl(MENU_DISPLAY_CTL_FONT_SIZE, &font_size); + font_size = menu_display_get_font_size(); params.x = x / width; params.y = 1.0f - (y + font_size / 3) / height; @@ -285,7 +283,7 @@ static void mui_render_quad(mui_handle_t *mui, coords.lut_tex_coord = NULL; coords.color = coord_color; - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); + menu_display_blend_begin(); draw.x = x; draw.y = (int)height - y - (int)h; @@ -297,17 +295,15 @@ static void mui_render_quad(mui_handle_t *mui, draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; draw.pipeline.id = 0; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); - - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); + menu_display_draw(&draw); + menu_display_blend_end(); } static void mui_draw_tab_begin(mui_handle_t *mui, unsigned width, unsigned height, float *white_bg, float *grey_bg) { - float scale_factor; - menu_display_ctl(MENU_DISPLAY_CTL_GET_DPI, &scale_factor); + float scale_factor = menu_display_get_dpi(); mui->tabs_height = scale_factor / 3; @@ -350,7 +346,7 @@ static void mui_draw_scrollbar(mui_handle_t *mui, if (!mui) return; - menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); + header_height = menu_display_get_header_height(); content_height = menu_entries_get_end() * mui->line_height; total_height = height - header_height - mui->tabs_height; @@ -404,7 +400,7 @@ static void mui_render_messagebox(const char *message) video_driver_get_size(&width, &height); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_SIZE, &font_size); + font_size = menu_display_get_font_size(); x = width / 2; y = height / 2 - list->size * font_size / 2; @@ -445,9 +441,9 @@ static void mui_render(void *data) if (menu_animation_ctl(MENU_ANIMATION_CTL_IDEAL_DELTA_TIME_GET, &delta)) menu_animation_ctl(MENU_ANIMATION_CTL_UPDATE, &delta.ideal); - menu_display_ctl(MENU_DISPLAY_CTL_SET_WIDTH, &width); - menu_display_ctl(MENU_DISPLAY_CTL_SET_HEIGHT, &height); - menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); + menu_display_set_width(width); + menu_display_set_height(height); + header_height = menu_display_get_header_height(); if (settings->menu.pointer.enable) { @@ -624,10 +620,10 @@ static void mui_render_menu_list(mui_handle_t *mui, size_t end = menu_entries_get_end(); video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); - if (!menu_display_ctl(MENU_DISPLAY_CTL_UPDATE_PENDING, NULL)) + if (!menu_display_get_update_pending()) return; - menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); + header_height = menu_display_get_header_height(); mui->list_block.carr.coords.vertices = 0; @@ -711,13 +707,15 @@ static int mui_get_core_title(char *s, size_t len) static void mui_draw_bg(menu_display_ctx_draw_t *draw) { - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); + menu_display_blend_begin(); + draw->x = 0; draw->y = 0; draw->pipeline.id = 0; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW_BG, draw); - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, draw); - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); + + menu_display_draw_bg(draw); + menu_display_draw(draw); + menu_display_blend_end(); } static void mui_frame(void *data) @@ -789,8 +787,7 @@ static void mui_frame(void *data) const uint32_t activetab_color = 0x0096f2ff; const uint32_t passivetab_color = 0x9e9e9eff; bool background_rendered = false; - bool libretro_running = menu_display_ctl( - MENU_DISPLAY_CTL_LIBRETRO_RUNNING, NULL); + bool libretro_running = menu_display_libretro_running(); video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); @@ -802,8 +799,8 @@ static void mui_frame(void *data) video_driver_get_size(&width, &height); - menu_display_ctl(MENU_DISPLAY_CTL_SET_VIEWPORT, NULL); - menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); + menu_display_set_viewport(); + header_height = menu_display_get_header_height(); if (libretro_running) { @@ -818,8 +815,7 @@ static void mui_frame(void *data) draw.vertex_count = 4; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; - if (!menu_display_ctl(MENU_DISPLAY_CTL_LIBRETRO_RUNNING, NULL) - && draw.texture) + if (!menu_display_libretro_running() && draw.texture) draw.color = &white_bg[0]; mui_draw_bg(&draw); @@ -833,7 +829,7 @@ static void mui_frame(void *data) clearcolor.b = 1.0f; clearcolor.a = 0.75f; - menu_display_ctl(MENU_DISPLAY_CTL_CLEAR_COLOR, &clearcolor); + menu_display_clear_color(&clearcolor); if (mui->textures.bg) { @@ -852,8 +848,7 @@ static void mui_frame(void *data) draw.vertex_count = 4; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; - if (!menu_display_ctl(MENU_DISPLAY_CTL_LIBRETRO_RUNNING, NULL) - && draw.texture) + if (!menu_display_libretro_running() && draw.texture) draw.color = &white_bg[0]; mui_draw_bg(&draw); @@ -880,12 +875,12 @@ static void mui_frame(void *data) width, height, &lightblue_bg[0]); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_BIND_BLOCK, &mui->list_block); + menu_display_font_bind_block(&mui->list_block); mui_render_menu_list(mui, width, height, normal_color, hover_color, &pure_white[0]); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_FLUSH_BLOCK, NULL); + menu_display_font_flush_block(); menu_animation_ctl(MENU_ANIMATION_CTL_SET_ACTIVE, NULL); /* header */ @@ -997,8 +992,8 @@ static void mui_frame(void *data) width, height); - menu_display_ctl(MENU_DISPLAY_CTL_RESTORE_CLEAR_COLOR, NULL); - menu_display_ctl(MENU_DISPLAY_CTL_UNSET_VIEWPORT, NULL); + menu_display_restore_clear_color(); + menu_display_unset_viewport(); } static void mui_font(void) @@ -1008,7 +1003,7 @@ static void mui_font(void) menu_display_ctx_font_t font_info; settings_t *settings = config_get_ptr(); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_SIZE, &font_size); + font_size = menu_display_get_font_size(); fill_pathname_join(mediapath, settings->directory.assets, "glui", sizeof(mediapath)); @@ -1018,7 +1013,7 @@ static void mui_font(void) font_info.path = fontpath; font_info.size = font_size; - if (!menu_display_ctl(MENU_DISPLAY_CTL_FONT_MAIN_INIT, &font_info)) + if (!menu_display_font_main_init(&font_info)) RARCH_WARN("Failed to load font."); } @@ -1037,7 +1032,7 @@ static void mui_layout(mui_handle_t *mui) * * On desktops, we just care about readability, with every widget * size proportional to the display width. */ - menu_display_ctl(MENU_DISPLAY_CTL_GET_DPI, &scale_factor); + scale_factor = menu_display_get_dpi(); new_header_height = scale_factor / 3; new_font_size = scale_factor / 9; @@ -1049,17 +1044,15 @@ static void mui_layout(mui_handle_t *mui) mui->margin = scale_factor / 9; mui->icon_size = scale_factor / 3; - menu_display_ctl(MENU_DISPLAY_CTL_SET_HEADER_HEIGHT, - &new_header_height); - menu_display_ctl(MENU_DISPLAY_CTL_SET_FONT_SIZE, - &new_font_size); + menu_display_set_header_height(new_header_height); + menu_display_set_font_size(new_font_size); /* we assume the average glyph aspect ratio is close to 3:4 */ mui->glyph_width = new_font_size * 3/4; mui_font(); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_BUF, &fb_buf); + fb_buf = menu_display_get_font_buffer(); if (fb_buf) /* calculate a more realistic ticker_limit */ { @@ -1080,7 +1073,7 @@ static void *mui_init(void **userdata) if (!menu) goto error; - if (!menu_display_ctl(MENU_DISPLAY_CTL_INIT_FIRST_DRIVER, NULL)) + if (!menu_display_init_first_driver()) goto error; mui = (mui_handle_t*)calloc(1, sizeof(mui_handle_t)); @@ -1134,7 +1127,7 @@ static void mui_context_destroy(void *data) for (i = 0; i < MUI_TEXTURE_LAST; i++) video_driver_texture_unload(&mui->textures.list[i]); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_MAIN_DEINIT, NULL); + menu_display_font_main_deinit(); mui_context_bg_destroy(mui); } @@ -1498,7 +1491,7 @@ static int mui_pointer_tap(void *userdata, video_driver_get_size(&width, &height); menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection); - menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); + header_height = menu_display_get_header_height(); if (y < header_height) { diff --git a/menu/drivers/menu_generic.c b/menu/drivers/menu_generic.c index cae769c718..293fba9f12 100644 --- a/menu/drivers/menu_generic.c +++ b/menu/drivers/menu_generic.c @@ -289,7 +289,7 @@ int generic_menu_iterate(void *data, void *userdata, enum menu_action action) if ( action != MENU_ACTION_NOOP || menu_entries_ctl(MENU_ENTRIES_CTL_NEEDS_REFRESH, NULL) - || menu_display_ctl(MENU_DISPLAY_CTL_UPDATE_PENDING, NULL)) + || menu_display_get_update_pending()) { BIT64_SET(menu->state, MENU_STATE_RENDER_FRAMEBUFFER); } diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index f9f0ee3616..5717e5b101 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -202,19 +202,15 @@ static void blit_line(int x, int y, const char *message, uint16_t color) { unsigned i, j; - size_t pitch = 0; - - menu_display_ctl(MENU_DISPLAY_CTL_FB_PITCH, &pitch); + size_t pitch = menu_display_get_framebuffer_pitch(); if (!rgui_framebuf_data) return; while (*message) { - uint8_t *font_fb = NULL; - uint32_t symbol = string_walk(&message); - - menu_display_ctl(MENU_DISPLAY_CTL_FONT_FB, &font_fb); + const uint8_t *font_fb = menu_display_get_font_framebuffer(); + uint32_t symbol = string_walk(&message); for (j = 0; j < FONT_HEIGHT; j++) { @@ -244,7 +240,7 @@ static bool init_font(menu_handle_t *menu, const uint8_t *font_bmp_buf) if (!font) return false; - menu_display_ctl(MENU_DISPLAY_CTL_SET_FONT_DATA_INIT, &fb_font_inited); + menu_display_set_font_data_init(fb_font_inited); for (i = 0; i < 256; i++) { @@ -254,7 +250,7 @@ static bool init_font(menu_handle_t *menu, const uint8_t *font_bmp_buf) font_bmp_buf + 54 + 3 * (256 * (255 - 16 * y) + 16 * x)); } - menu_display_ctl(MENU_DISPLAY_CTL_SET_FONT_FB, &font); + menu_display_set_font_framebuffer(font); return true; } @@ -273,7 +269,7 @@ static bool rguidisp_init_font(menu_handle_t *menu) if (!font_bin_buf) return false; - menu_display_ctl(MENU_DISPLAY_CTL_SET_FONT_FB, &font_bin_buf); + menu_display_set_font_framebuffer(font_bin_buf); return true; } @@ -285,9 +281,9 @@ static void rgui_render_background(void) uint16_t *src = NULL; uint16_t *dst = NULL; - menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); - menu_display_ctl(MENU_DISPLAY_CTL_FB_PITCH, &fb_pitch); + fb_width = menu_display_get_width(); + fb_height = menu_display_get_height(); + fb_pitch = menu_display_get_framebuffer_pitch(); pitch_in_pixels = fb_pitch >> 1; size = fb_pitch * 4; @@ -343,9 +339,9 @@ static void rgui_render_messagebox(const char *message) width = 0; glyphs_width = 0; - menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); - menu_display_ctl(MENU_DISPLAY_CTL_FB_PITCH, &fb_pitch); + fb_width = menu_display_get_width(); + fb_height = menu_display_get_height(); + fb_pitch = menu_display_get_framebuffer_pitch(); for (i = 0; i < list->size; i++) { @@ -403,9 +399,9 @@ static void rgui_blit_cursor(void) int16_t x = menu_input_mouse_state(MENU_MOUSE_X_AXIS); int16_t y = menu_input_mouse_state(MENU_MOUSE_Y_AXIS); - menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); - menu_display_ctl(MENU_DISPLAY_CTL_FB_PITCH, &fb_pitch); + fb_width = menu_display_get_width(); + fb_height = menu_display_get_height(); + fb_pitch = menu_display_get_framebuffer_pitch(); rgui_color_rect(fb_pitch, fb_width, fb_height, x, y - 5, 1, 11, 0xFFFF); rgui_color_rect(fb_pitch, fb_width, fb_height, x - 5, y, 11, 1, 0xFFFF); @@ -438,7 +434,7 @@ static void rgui_render(void *data) if (!rgui->force_redraw) { - menu_display_ctl(MENU_DISPLAY_CTL_MSG_FORCE, &msg_force); + msg_force = menu_display_get_msg_force(); if (menu_entries_ctl(MENU_ENTRIES_CTL_NEEDS_REFRESH, NULL) && menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL) && !msg_force) @@ -447,13 +443,13 @@ static void rgui_render(void *data) if (runloop_ctl(RUNLOOP_CTL_IS_IDLE, NULL)) return; - if (!menu_display_ctl(MENU_DISPLAY_CTL_UPDATE_PENDING, NULL)) + if (!menu_display_get_update_pending()) return; } - menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); - menu_display_ctl(MENU_DISPLAY_CTL_FB_PITCH, &fb_pitch); + fb_width = menu_display_get_width(); + fb_height = menu_display_get_height(); + fb_pitch = menu_display_get_framebuffer_pitch(); /* if the framebuffer changed size, recache the background */ if (rgui->last_width != fb_width || rgui->last_height != fb_height) @@ -463,12 +459,11 @@ static void rgui_render(void *data) rgui->last_height = fb_height; } - menu_display_ctl(MENU_DISPLAY_CTL_SET_FRAMEBUFFER_DIRTY_FLAG, NULL); + menu_display_set_framebuffer_dirty_flag(); menu_animation_ctl(MENU_ANIMATION_CTL_CLEAR_ACTIVE, NULL); rgui->force_redraw = false; - if (settings->menu.pointer.enable) { unsigned new_val; @@ -574,7 +569,7 @@ static void rgui_render(void *data) datetime.len = sizeof(timedate); datetime.time_mode = 3; - menu_display_ctl(MENU_DISPLAY_CTL_TIMEDATE, &datetime); + menu_display_timedate(&datetime); blit_line( RGUI_TERM_WIDTH(fb_width) * FONT_WIDTH_STRIDE - RGUI_TERM_START_X(fb_width), @@ -705,10 +700,10 @@ static void *rgui_init(void **userdata) fb_pitch = fb_width * sizeof(uint16_t); new_font_height = FONT_HEIGHT_STRIDE * 2; - menu_display_ctl(MENU_DISPLAY_CTL_SET_WIDTH, &fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_SET_HEIGHT, &fb_height); - menu_display_ctl(MENU_DISPLAY_CTL_SET_HEADER_HEIGHT, &new_font_height); - menu_display_ctl(MENU_DISPLAY_CTL_SET_FB_PITCH, &fb_pitch); + menu_display_set_width(fb_width); + menu_display_set_height(fb_height); + menu_display_set_header_height(new_font_height); + menu_display_set_framebuffer_pitch(fb_pitch); start = 0; menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &start); @@ -736,31 +731,30 @@ error: static void rgui_free(void *data) { - uint8_t *font_fb; + const uint8_t *font_fb; bool fb_font_inited = false; - menu_display_ctl(MENU_DISPLAY_CTL_FONT_DATA_INIT, &fb_font_inited); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_FB, &font_fb); + fb_font_inited = menu_display_get_font_data_init(); + font_fb = menu_display_get_font_framebuffer(); if (fb_font_inited) - free(font_fb); + free((void*)font_fb); fb_font_inited = false; - - - menu_display_ctl(MENU_DISPLAY_CTL_SET_FONT_DATA_INIT, &fb_font_inited); + menu_display_set_font_data_init(fb_font_inited); } static void rgui_set_texture(void) { unsigned fb_width, fb_height; - if (!menu_display_ctl(MENU_DISPLAY_CTL_GET_FRAMEBUFFER_DIRTY_FLAG, NULL)) + if (!menu_display_get_framebuffer_dirty_flag()) return; - menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); - menu_display_ctl(MENU_DISPLAY_CTL_UNSET_FRAMEBUFFER_DIRTY_FLAG, NULL); + fb_width = menu_display_get_width(); + fb_height = menu_display_get_height(); + + menu_display_unset_framebuffer_dirty_flag(); video_driver_set_texture_frame(rgui_framebuf_data, false, fb_width, fb_height, 1.0f); @@ -789,8 +783,8 @@ static void rgui_navigation_set(void *data, bool scroll) if (!scroll) return; - menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); + fb_width = menu_display_get_width(); + fb_height = menu_display_get_height(); if (selection < RGUI_TERM_HEIGHT(fb_width, fb_height) /2) { @@ -859,7 +853,7 @@ static int rgui_pointer_tap(void *data, bool scroll = false; menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection); - menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); + header_height = menu_display_get_header_height(); if (y < header_height) { diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 3bafb72c4c..fa08b94616 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -511,14 +511,14 @@ static void xmb_draw_icon( draw.x = x + 2; draw.y = height - y - 2; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); + menu_display_draw(&draw); } coords.color = (const float*)color; draw.x = x; draw.y = height - y; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); + menu_display_draw(&draw); } static void xmb_draw_thumbnail(xmb_handle_t *xmb, float *color, @@ -542,7 +542,7 @@ static void xmb_draw_thumbnail(xmb_handle_t *xmb, float *color, rotate_draw.scale_z = 1; rotate_draw.scale_enable = true; - menu_display_ctl(MENU_DISPLAY_CTL_ROTATE_Z, &rotate_draw); + menu_display_rotate_z(&rotate_draw); coords.vertices = 4; coords.vertex = NULL; @@ -568,14 +568,14 @@ static void xmb_draw_thumbnail(xmb_handle_t *xmb, float *color, draw.x = x + 2; draw.y = height - y - 2; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); + menu_display_draw(&draw); } coords.color = (const float*)color; draw.x = x; draw.y = height - y; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); + menu_display_draw(&draw); } static void xmb_draw_text(xmb_handle_t *xmb, @@ -650,7 +650,7 @@ static void xmb_render_messagebox_internal( if (list->elems == 0) goto end; - menu_display_ctl(MENU_DISPLAY_CTL_FONT_SIZE, &font_size); + font_size = menu_display_get_font_size(); x = width / 2 - strlen(list->elems[0].data) * font_size / 4; y = height / 2 - list->size * font_size / 2; @@ -1659,14 +1659,14 @@ static void xmb_draw_items(xmb_handle_t *xmb, rotate_draw.scale_z = 1; rotate_draw.scale_enable = true; - menu_display_ctl(MENU_DISPLAY_CTL_ROTATE_Z, &rotate_draw); + menu_display_rotate_z(&rotate_draw); menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i); if (list == xmb->selection_buf_old) i = 0; - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); + menu_display_blend_begin(); for (; i < end; i++) { @@ -1826,7 +1826,7 @@ static void xmb_draw_items(xmb_handle_t *xmb, rotate_draw.scale_z = 1; rotate_draw.scale_enable = true; - menu_display_ctl(MENU_DISPLAY_CTL_ROTATE_Z, &rotate_draw); + menu_display_rotate_z(&rotate_draw); xmb_draw_icon( xmb->icon.size, @@ -1859,7 +1859,7 @@ static void xmb_draw_items(xmb_handle_t *xmb, 1, &color[0]); } - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); + menu_display_blend_end(); } static void xmb_render(void *data) @@ -1933,7 +1933,8 @@ static void xmb_draw_bg( { menu_display_ctx_draw_t draw; settings_t *settings = config_get_ptr(); - bool running = menu_display_ctl(MENU_DISPLAY_CTL_LIBRETRO_RUNNING, NULL); + + bool running = menu_display_libretro_running(); draw.x = 0; draw.y = 0; @@ -1947,8 +1948,8 @@ static void xmb_draw_bg( draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; draw.pipeline.id = 0; - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); - menu_display_ctl(MENU_DISPLAY_CTL_SET_VIEWPORT, NULL); + menu_display_blend_begin(); + menu_display_set_viewport(); if (settings->menu.shader_pipeline > 0) { @@ -1959,25 +1960,24 @@ static void xmb_draw_bg( else menu_display_set_alpha(draw.color, coord_white[3]); - menu_display_ctl(MENU_DISPLAY_CTL_DRAW_GRADIENT, &draw); + menu_display_draw_gradient(&draw); draw.pipeline.id = VIDEO_SHADER_MENU_SEC; if (settings->menu.shader_pipeline == 2) draw.pipeline.id = VIDEO_SHADER_MENU; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW_PIPELINE, &draw); + menu_display_draw_pipeline(&draw); } else { if (!running && draw.texture) draw.color = &coord_white[0]; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW_BG, &draw); + menu_display_draw_bg(&draw); } - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); - - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); + menu_display_draw(&draw); + menu_display_blend_end(); } static void xmb_draw_dark_layer( @@ -2012,9 +2012,9 @@ static void xmb_draw_dark_layer( draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; draw.pipeline.id = 0; - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); + menu_display_blend_begin(); + menu_display_draw(&draw); + menu_display_blend_end(); } static void xmb_frame(void *data) @@ -2040,7 +2040,7 @@ static void xmb_frame(void *data) video_driver_get_size(&width, &height); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_BIND_BLOCK, &xmb->raster_block); + menu_display_font_bind_block(&xmb->raster_block); xmb->raster_block.carr.coords.vertices = 0; @@ -2091,8 +2091,8 @@ static void xmb_frame(void *data) rotate_draw.scale_z = 1; rotate_draw.scale_enable = true; - menu_display_ctl(MENU_DISPLAY_CTL_ROTATE_Z, &rotate_draw); - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); + menu_display_rotate_z(&rotate_draw); + menu_display_blend_begin(); if (strcmp(xmb_thumbnails_ident(), "OFF") && xmb->thumbnail) xmb_draw_thumbnail(xmb, &coord_white[0], width, height); @@ -2122,7 +2122,7 @@ static void xmb_frame(void *data) datetime.len = sizeof(timedate); datetime.time_mode = 4; - menu_display_ctl(MENU_DISPLAY_CTL_TIMEDATE, &datetime); + menu_display_timedate(&datetime); xmb_draw_text(xmb, timedate, width - xmb->margins.title.left - xmb->icon.size / 4, @@ -2149,7 +2149,7 @@ static void xmb_frame(void *data) 0, 1, &coord_white[0]); - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); + menu_display_blend_begin(); /* Horizontal tab icons */ for (i = 0; i <= xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) @@ -2181,7 +2181,7 @@ static void xmb_frame(void *data) rotate_draw.scale_z = 1; rotate_draw.scale_enable = true; - menu_display_ctl(MENU_DISPLAY_CTL_ROTATE_Z, &rotate_draw); + menu_display_rotate_z(&rotate_draw); xmb_draw_icon( xmb->icon.size, @@ -2198,7 +2198,7 @@ static void xmb_frame(void *data) } } - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); + menu_display_blend_end(); /* Vertical icons */ xmb_draw_items(xmb, @@ -2227,7 +2227,7 @@ static void xmb_frame(void *data) width, height); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_FLUSH_BLOCK, NULL); + menu_display_font_flush_block(); menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_DISPLAY, &display_kb); @@ -2269,7 +2269,7 @@ static void xmb_frame(void *data) width, height); - menu_display_ctl(MENU_DISPLAY_CTL_UNSET_VIEWPORT, NULL); + menu_display_unset_viewport(); } @@ -2281,7 +2281,7 @@ static void xmb_font(xmb_handle_t *xmb) menu_display_ctx_font_t font_info; settings_t *settings = config_get_ptr(); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_SIZE, &font_size); + font_size = menu_display_get_font_size(); fill_pathname_join( mediapath, @@ -2298,7 +2298,7 @@ static void xmb_font(xmb_handle_t *xmb) font_info.path = fontpath; font_info.size = font_size; - if (!menu_display_ctl(MENU_DISPLAY_CTL_FONT_MAIN_INIT, &font_info)) + if (!menu_display_font_main_init(&font_info)) RARCH_WARN("Failed to load font."); } @@ -2345,8 +2345,8 @@ static void xmb_layout(xmb_handle_t *xmb) xmb->margins.setting.left = 600.0 * scale_factor; xmb->icon.size = 128.0 * scale_factor; - menu_display_ctl(MENU_DISPLAY_CTL_SET_FONT_SIZE, &new_font_size); - menu_display_ctl(MENU_DISPLAY_CTL_SET_HEADER_HEIGHT, &new_header_height); + menu_display_set_font_size(new_font_size); + menu_display_set_header_height(new_header_height); current = selection; end = menu_entries_get_end(); @@ -2418,7 +2418,7 @@ static void xmb_init_ribbon(xmb_handle_t * xmb) gfx_coord_array_t *ca = NULL; memset(&dummy[0], 0, 4 * XMB_RIBBON_VERTICES * sizeof(float)); - menu_display_ctl(MENU_DISPLAY_CTL_COORDS_ARRAY_GET, &ca); + ca = menu_display_get_coords_array(); /* Set up vertices */ i = 0; @@ -2451,7 +2451,7 @@ static void *xmb_init(void **userdata) if (!menu) goto error; - if (!menu_display_ctl(MENU_DISPLAY_CTL_INIT_FIRST_DRIVER, NULL)) + if (!menu_display_init_first_driver()) goto error; video_driver_get_size(&width, &height); @@ -2487,8 +2487,8 @@ static void *xmb_init(void **userdata) * for XMB, we should refactor this dependency * away. */ - menu_display_ctl(MENU_DISPLAY_CTL_SET_WIDTH, &width); - menu_display_ctl(MENU_DISPLAY_CTL_SET_HEIGHT, &height); + menu_display_set_width(width); + menu_display_set_height(height); menu_display_allocate_white_texture(); @@ -3017,7 +3017,7 @@ static void xmb_context_destroy(void *data) xmb_context_destroy_horizontal_list(xmb); xmb_context_bg_destroy(xmb); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_MAIN_DEINIT, NULL); + menu_display_font_main_deinit(); } static void xmb_toggle(void *userdata, bool menu_on) @@ -3204,7 +3204,7 @@ static int xmb_pointer_tap(void *userdata, bool scroll = false; menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection); - menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); + header_height = menu_display_get_header_height(); if (y < header_height) { diff --git a/menu/drivers/zarch.c b/menu/drivers/zarch.c index 8a2a783040..64dde48889 100644 --- a/menu/drivers/zarch.c +++ b/menu/drivers/zarch.c @@ -174,7 +174,7 @@ static void zarch_zui_font(void) menu_display_ctx_font_t font_info; settings_t *settings = config_get_ptr(); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_SIZE, &font_size); + font_size = menu_display_get_font_size(); fill_pathname_join( mediapath, @@ -187,7 +187,7 @@ static void zarch_zui_font(void) font_info.path = fontpath; font_info.size = font_size; - if (!menu_display_ctl(MENU_DISPLAY_CTL_FONT_MAIN_INIT, &font_info)) + if (!menu_display_font_main_init(&font_info)) RARCH_WARN("Failed to load font."); } @@ -874,15 +874,15 @@ static void zarch_frame(void *data) zui_t *zui = (zui_t*)data; gfx_coord_array_t *ca = NULL; - menu_display_ctl(MENU_DISPLAY_CTL_COORDS_ARRAY_GET, &ca); + ca = menu_display_get_coords_array(); if (!zui) return; video_driver_get_size(&zui->width, &zui->height); - menu_display_ctl(MENU_DISPLAY_CTL_SET_VIEWPORT, NULL); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_BUF, &zui->fb_buf); + menu_display_set_viewport(); + zui->fb_buf = menu_display_get_font_buffer(); for (i = 0; i < 16; i++) { @@ -904,11 +904,11 @@ static void zarch_frame(void *data) zui->mouse.wheel = menu_input_mouse_state(MENU_MOUSE_WHEEL_DOWN) - menu_input_mouse_state(MENU_MOUSE_WHEEL_UP); - menu_display_ctl(MENU_DISPLAY_CTL_COORDS_ARRAY_RESET, NULL); + menu_display_coords_array_reset(); zui->tmp_block.carr.coords.vertices = 0; - menu_display_ctl(MENU_DISPLAY_CTL_FONT_BIND_BLOCK, &zui->tmp_block); + menu_display_font_bind_block(&zui->tmp_block); menu_display_push_quad(zui->width, zui->height, zui_bg_screen, 0, 0, zui->width, zui->height); @@ -944,7 +944,7 @@ static void zarch_frame(void *data) else if (zui->item.active == 0) zui->item.active = -1; - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); + menu_display_blend_begin(); draw.x = 0; draw.y = 0; @@ -956,15 +956,14 @@ static void zarch_frame(void *data) draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLES; draw.pipeline.id = 0; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); - - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); + menu_display_draw(&draw); + menu_display_blend_end(); memset(&draw, 0, sizeof(menu_display_ctx_draw_t)); coord_draw.ptr = NULL; - menu_display_ctl(MENU_DISPLAY_CTL_TEX_COORDS_GET, &coord_draw); + menu_display_get_tex_coords(&coord_draw); draw.width = zui->width; draw.height = zui->height; @@ -975,21 +974,20 @@ static void zarch_frame(void *data) draw.vertex_count = 4; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; - if (!menu_display_ctl(MENU_DISPLAY_CTL_LIBRETRO_RUNNING, NULL) - && draw.texture) + if (!menu_display_libretro_running() && draw.texture) draw.color = &coord_color2[0]; - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); + menu_display_blend_begin(); draw.x = 0; draw.y = 0; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW_BG, &draw); - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); + menu_display_draw_bg(&draw); + menu_display_draw(&draw); + menu_display_blend_end(); zui->rendering = false; - menu_display_ctl(MENU_DISPLAY_CTL_FONT_FLUSH_BLOCK, NULL); - menu_display_ctl(MENU_DISPLAY_CTL_UNSET_VIEWPORT, NULL); + menu_display_font_flush_block(); + menu_display_unset_viewport(); } static void *zarch_init(void **userdata) @@ -1003,7 +1001,7 @@ static void *zarch_init(void **userdata) if (!menu) goto error; - if (!menu_display_ctl(MENU_DISPLAY_CTL_INIT_FIRST_DRIVER, NULL)) + if (!menu_display_init_first_driver()) goto error; zui = (zui_t*)calloc(1, sizeof(zui_t)); @@ -1020,10 +1018,10 @@ static void *zarch_init(void **userdata) } unused = 1000; - menu_display_ctl(MENU_DISPLAY_CTL_SET_HEADER_HEIGHT, &unused); + menu_display_set_header_height(unused); unused = 28; - menu_display_ctl(MENU_DISPLAY_CTL_SET_FONT_SIZE, &unused); + menu_display_set_font_size(unused); (void)unused; @@ -1067,7 +1065,7 @@ static void zarch_context_bg_destroy(void *data) static void zarch_context_destroy(void *data) { - menu_display_ctl(MENU_DISPLAY_CTL_FONT_MAIN_DEINIT, NULL); + menu_display_font_main_deinit(); zarch_context_bg_destroy(data); } @@ -1111,7 +1109,7 @@ static void zarch_context_reset(void *data) if (settings->video.font_enable) font_info.path = settings->path.font; - if (!menu_display_ctl(MENU_DISPLAY_CTL_FONT_MAIN_INIT, &font_info)) + if (!menu_display_font_main_init(&font_info)) RARCH_WARN("Failed to load font."); zarch_context_bg_destroy(zui); @@ -1121,7 +1119,7 @@ static void zarch_context_reset(void *data) menu_display_allocate_white_texture(); - menu_display_ctl(MENU_DISPLAY_CTL_SET_FONT_SIZE, &zui->font_size); + menu_display_set_font_size(zui->font_size); zarch_zui_font(); } diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index 966db0b55a..13bb13beb0 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -160,7 +160,7 @@ static void menu_display_gl_draw_pipeline(void *data) static float t = 0; gfx_coord_array_t *ca = NULL; - menu_display_ctl(MENU_DISPLAY_CTL_COORDS_ARRAY_GET, &ca); + ca = menu_display_get_coords_array(); draw->x = 0; draw->y = 0; diff --git a/menu/drivers_display/menu_display_vulkan.c b/menu/drivers_display/menu_display_vulkan.c index 8c8142174e..a8c0b4ff00 100644 --- a/menu/drivers_display/menu_display_vulkan.c +++ b/menu/drivers_display/menu_display_vulkan.c @@ -102,7 +102,7 @@ static void menu_display_vk_draw_pipeline(void *data) if (!vk || !draw) return; - menu_display_ctl(MENU_DISPLAY_CTL_COORDS_ARRAY_GET, &ca); + ca = menu_display_get_coords_array(); draw->x = 0; draw->y = 0; draw->coords = (struct gfx_coords*)&ca->coords; diff --git a/menu/menu_content.c b/menu/menu_content.c index 422696a706..61ec905824 100644 --- a/menu/menu_content.c +++ b/menu/menu_content.c @@ -89,12 +89,11 @@ static bool menu_content_load(void) content_ctx_info_t content_info; char name[PATH_MAX_LENGTH]; char msg[PATH_MAX_LENGTH]; - bool msg_force = true; char *fullpath = NULL; runloop_ctl(RUNLOOP_CTL_GET_CONTENT_PATH, &fullpath); /* redraw menu frame */ - menu_display_ctl(MENU_DISPLAY_CTL_SET_MSG_FORCE, &msg_force); + menu_display_set_msg_force(true); menu_driver_ctl(RARCH_MENU_CTL_RENDER, NULL); if (*fullpath) diff --git a/menu/menu_display.c b/menu/menu_display.c index 7bb36b6470..3e453aa05e 100644 --- a/menu/menu_display.c +++ b/menu/menu_display.c @@ -92,11 +92,9 @@ static bool menu_display_check_compatibility( return false; } -static void menu_display_timedate(void *data) +void menu_display_timedate(menu_display_ctx_datetime_t *datetime) { time_t time_; - menu_display_ctx_datetime_t *datetime = - (menu_display_ctx_datetime_t *)data; if (!datetime) return; @@ -128,459 +126,419 @@ static void menu_display_timedate(void *data) } } +static gfx_coord_array_t menu_disp_ca; +static unsigned menu_display_framebuf_width = 0; +static unsigned menu_display_framebuf_height = 0; +static size_t menu_display_framebuf_pitch = 0; +static int menu_display_font_size = 0; +static unsigned menu_display_header_height = 0; +static bool menu_display_msg_force = false; +static bool menu_display_font_alloc_framebuf = false; +static bool menu_display_framebuf_dirty = false; +static const uint8_t *menu_display_font_framebuf = NULL; +static void *menu_display_font_buf = NULL; +static msg_queue_t *menu_display_msg_queue = NULL; +static menu_display_ctx_driver_t *menu_disp = NULL; -bool menu_display_ctl(enum menu_display_ctl_state state, void *data) +void menu_display_blend_begin(void) { - unsigned width, height; - static gfx_coord_array_t menu_disp_ca; - static unsigned menu_display_framebuf_width = 0; - static unsigned menu_display_framebuf_height = 0; - static size_t menu_display_framebuf_pitch = 0; - static int menu_display_font_size = 0; - static unsigned menu_display_header_height = 0; - static bool menu_display_msg_force = false; - static bool menu_display_font_alloc_framebuf = false; - static bool menu_display_framebuf_dirty = false; - static const uint8_t *menu_display_font_framebuf = NULL; - static void *menu_display_font_buf = NULL; - static msg_queue_t *menu_display_msg_queue = NULL; - static menu_display_ctx_driver_t *menu_disp = NULL; - settings_t *settings = config_get_ptr(); + if (!menu_disp || !menu_disp->blend_begin) + return; + menu_disp->blend_begin(); +} - switch (state) +void menu_display_blend_end(void) +{ + if (!menu_disp || !menu_disp->blend_end) + return; + menu_disp->blend_end(); +} + +void menu_display_font_main_deinit(void) +{ + if (menu_display_font_buf) + font_driver_free(menu_display_font_buf); + menu_display_font_buf = NULL; + menu_display_font_size = 0; +} + +bool menu_display_font_main_init(menu_display_ctx_font_t *font) +{ + menu_display_font_main_deinit(); + if (!font || !menu_disp) + return false; + + if (!menu_disp->font_init_first) + return false; + + if (!menu_disp->font_init_first(&menu_display_font_buf, + video_driver_get_ptr(false), + font->path, font->size)) + return false; + + menu_display_font_size = font->size; + return true; +} + +void menu_display_font_bind_block(void *block) +{ + font_driver_bind_block(menu_display_font_buf, block); +} + +bool menu_display_font_flush_block(void) +{ + if (!menu_display_font_buf) + return false; + + font_driver_flush(menu_display_font_buf); + font_driver_bind_block(menu_display_font_buf, NULL); + return true; +} + +void menu_display_framebuffer_deinit(void) +{ + menu_display_framebuf_width = 0; + menu_display_framebuf_height = 0; + menu_display_framebuf_pitch = 0; +} + +void menu_display_deinit(void) +{ + if (menu_display_msg_queue) + msg_queue_free(menu_display_msg_queue); + gfx_coord_array_free(&menu_disp_ca); + menu_display_msg_queue = NULL; + menu_display_msg_force = false; + menu_display_header_height = 0; + menu_disp = NULL; + + menu_animation_ctl(MENU_ANIMATION_CTL_DEINIT, NULL); + menu_display_framebuffer_deinit(); +} + +bool menu_display_init(void) +{ + retro_assert(menu_display_msg_queue = msg_queue_new(8)); + menu_disp_ca.allocated = 0; + return true; +} + +void menu_display_coords_array_reset(void) +{ + menu_disp_ca.coords.vertices = 0; +} + +gfx_coord_array_t *menu_display_get_coords_array(void) +{ + return &menu_disp_ca; +} + +void *menu_display_get_font_buffer(void) +{ + return menu_display_font_buf; +} + +void menu_display_set_font_buffer(void *buffer) +{ + menu_display_font_buf = buffer; +} + +const uint8_t *menu_display_get_font_framebuffer(void) +{ + return menu_display_font_framebuf; +} + +void menu_display_set_font_framebuffer(const uint8_t *buffer) +{ + menu_display_font_framebuf = buffer; +} + +bool menu_display_libretro_running(void) +{ + settings_t *settings = config_get_ptr(); + if (!settings->menu.pause_libretro) { - case MENU_DISPLAY_CTL_BLEND_BEGIN: - if (!menu_disp || !menu_disp->blend_begin) - return false; - menu_disp->blend_begin(); - break; - case MENU_DISPLAY_CTL_BLEND_END: - if (!menu_disp || !menu_disp->blend_end) - return false; - menu_disp->blend_end(); - break; - case MENU_DISPLAY_CTL_FONT_MAIN_DEINIT: - if (menu_display_font_buf) - font_driver_free(menu_display_font_buf); - menu_display_font_buf = NULL; - menu_display_font_size = 0; - break; - case MENU_DISPLAY_CTL_FONT_MAIN_INIT: - { - menu_display_ctx_font_t *font = (menu_display_ctx_font_t*)data; - - menu_display_ctl(MENU_DISPLAY_CTL_FONT_MAIN_DEINIT, NULL); - - if (!font || !menu_disp) - return false; - - if (!menu_disp->font_init_first) - return false; - - if (!menu_disp->font_init_first(&menu_display_font_buf, - video_driver_get_ptr(false), - font->path, font->size)) - return false; - - menu_display_font_size = font->size; - } - break; - case MENU_DISPLAY_CTL_FONT_BIND_BLOCK: - font_driver_bind_block(menu_display_font_buf, data); - break; - case MENU_DISPLAY_CTL_FONT_FLUSH_BLOCK: - if (!menu_display_font_buf) - return false; - - font_driver_flush(menu_display_font_buf); - font_driver_bind_block(menu_display_font_buf, NULL); - break; - case MENU_DISPLAY_CTL_FRAMEBUF_DEINIT: - menu_display_framebuf_width = 0; - menu_display_framebuf_height = 0; - menu_display_framebuf_pitch = 0; - break; - case MENU_DISPLAY_CTL_DEINIT: - if (menu_display_msg_queue) - msg_queue_free(menu_display_msg_queue); - gfx_coord_array_free(&menu_disp_ca); - menu_display_msg_queue = NULL; - menu_display_msg_force = false; - menu_display_header_height = 0; - menu_disp = NULL; - - menu_animation_ctl(MENU_ANIMATION_CTL_DEINIT, NULL); - menu_display_ctl(MENU_DISPLAY_CTL_FRAMEBUF_DEINIT, NULL); - break; - case MENU_DISPLAY_CTL_INIT: - retro_assert(menu_display_msg_queue = msg_queue_new(8)); - menu_disp_ca.allocated = 0; - break; - case MENU_DISPLAY_CTL_COORDS_ARRAY_RESET: - menu_disp_ca.coords.vertices = 0; - break; - case MENU_DISPLAY_CTL_COORDS_ARRAY_GET: - { - void **ptr = (void**)data; - if (!ptr) - return false; - *ptr = &menu_disp_ca; - } - break; - case MENU_DISPLAY_CTL_SET_STUB_DRAW_FRAME: - break; - case MENU_DISPLAY_CTL_UNSET_STUB_DRAW_FRAME: - break; - case MENU_DISPLAY_CTL_FONT_BUF: - { - void **ptr = (void**)data; - if (!ptr) - return false; - *ptr = menu_display_font_buf; - } - break; - case MENU_DISPLAY_CTL_SET_FONT_BUF: - { - void **ptr = (void**)data; - if (!ptr) - return false; - menu_display_font_buf = *ptr; - } - break; - case MENU_DISPLAY_CTL_FONT_FB: - { - uint8_t **ptr = (uint8_t**)data; - if (!ptr) - return false; - *ptr = (uint8_t*)menu_display_font_framebuf; - } - break; - case MENU_DISPLAY_CTL_SET_FONT_FB: - { - uint8_t **ptr = (uint8_t**)data; - if (!ptr) - return false; - menu_display_font_framebuf = *ptr; - } - break; - case MENU_DISPLAY_CTL_LIBRETRO_RUNNING: - if (!settings->menu.pause_libretro) - if (rarch_ctl(RARCH_CTL_IS_INITED, NULL) - && !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) - return true; - return false; - case MENU_DISPLAY_CTL_LIBRETRO: - video_driver_set_texture_enable(true, false); - - if (menu_display_ctl(MENU_DISPLAY_CTL_LIBRETRO_RUNNING, NULL)) - { - bool libretro_input_is_blocked = - input_driver_ctl( - RARCH_INPUT_CTL_IS_LIBRETRO_INPUT_BLOCKED, NULL); - - if (!libretro_input_is_blocked) - input_driver_ctl( - RARCH_INPUT_CTL_SET_LIBRETRO_INPUT_BLOCKED, NULL); - - core_run(); - - input_driver_ctl( - RARCH_INPUT_CTL_UNSET_LIBRETRO_INPUT_BLOCKED, NULL); - return true; - } - - return video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); - case MENU_DISPLAY_CTL_SET_WIDTH: - { - unsigned *ptr = (unsigned*)data; - if (!ptr) - return false; - menu_display_framebuf_width = *ptr; - } - break; - case MENU_DISPLAY_CTL_WIDTH: - { - unsigned *ptr = (unsigned*)data; - if (!ptr) - return false; - *ptr = menu_display_framebuf_width; - } - break; - case MENU_DISPLAY_CTL_HEIGHT: - { - unsigned *ptr = (unsigned*)data; - if (!ptr) - return false; - *ptr = menu_display_framebuf_height; - } - break; - case MENU_DISPLAY_CTL_HEADER_HEIGHT: - { - unsigned *ptr = (unsigned*)data; - if (!ptr) - return false; - *ptr = menu_display_header_height; - } - break; - case MENU_DISPLAY_CTL_SET_HEADER_HEIGHT: - { - unsigned *ptr = (unsigned*)data; - if (!ptr) - return false; - menu_display_header_height = *ptr; - } - break; - case MENU_DISPLAY_CTL_FONT_SIZE: - { - unsigned *ptr = (unsigned*)data; - if (!ptr) - return false; - *ptr = menu_display_font_size; - } - break; - case MENU_DISPLAY_CTL_SET_FONT_SIZE: - { - unsigned *ptr = (unsigned*)data; - if (!ptr) - return false; - menu_display_font_size = *ptr; - } - break; - case MENU_DISPLAY_CTL_SET_HEIGHT: - { - unsigned *ptr = (unsigned*)data; - if (!ptr) - return false; - menu_display_framebuf_height = *ptr; - } - break; - case MENU_DISPLAY_CTL_FB_PITCH: - { - size_t *ptr = (size_t*)data; - if (!ptr) - return false; - *ptr = menu_display_framebuf_pitch; - } - break; - case MENU_DISPLAY_CTL_SET_FB_PITCH: - { - size_t *ptr = (size_t*)data; - if (!ptr) - return false; - menu_display_framebuf_pitch = *ptr; - } - break; - case MENU_DISPLAY_CTL_MSG_FORCE: - { - bool *ptr = (bool*)data; - if (!ptr) - return false; - *ptr = menu_display_msg_force; - } - break; - case MENU_DISPLAY_CTL_SET_MSG_FORCE: - { - bool *ptr = (bool*)data; - if (!ptr) - return false; - menu_display_msg_force = *ptr; - } - break; - case MENU_DISPLAY_CTL_FONT_DATA_INIT: - { - bool *ptr = (bool*)data; - if (!ptr) - return false; - *ptr = menu_display_font_alloc_framebuf; - } + if (rarch_ctl(RARCH_CTL_IS_INITED, NULL) + && !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) return true; - case MENU_DISPLAY_CTL_SET_FONT_DATA_INIT: - { - bool *ptr = (bool*)data; - if (!ptr) - return false; - menu_display_font_alloc_framebuf = *ptr; - } - break; - case MENU_DISPLAY_CTL_UPDATE_PENDING: - { - if (menu_animation_ctl(MENU_ANIMATION_CTL_IS_ACTIVE, NULL)) - return true; - if (menu_display_ctl( - MENU_DISPLAY_CTL_GET_FRAMEBUFFER_DIRTY_FLAG, NULL)) - return true; - } - return false; - case MENU_DISPLAY_CTL_SET_VIEWPORT: - video_driver_get_size(&width, &height); - video_driver_set_viewport(width, - height, true, false); - break; - case MENU_DISPLAY_CTL_UNSET_VIEWPORT: - video_driver_get_size(&width, &height); - video_driver_set_viewport(width, - height, false, true); - break; - case MENU_DISPLAY_CTL_GET_FRAMEBUFFER_DIRTY_FLAG: - return menu_display_framebuf_dirty; - case MENU_DISPLAY_CTL_SET_FRAMEBUFFER_DIRTY_FLAG: - menu_display_framebuf_dirty = true; - break; - case MENU_DISPLAY_CTL_UNSET_FRAMEBUFFER_DIRTY_FLAG: - menu_display_framebuf_dirty = false; - break; - case MENU_DISPLAY_CTL_GET_DPI: - { - gfx_ctx_metrics_t metrics; - float *dpi = (float*)data; - *dpi = menu_dpi_override_value; + } + return false; +} - if (!settings) - return true; +bool menu_display_libretro(void) +{ + video_driver_set_texture_enable(true, false); - metrics.type = DISPLAY_METRIC_DPI; - metrics.value = dpi; + if (menu_display_libretro_running()) + { + bool libretro_input_is_blocked = + input_driver_ctl( + RARCH_INPUT_CTL_IS_LIBRETRO_INPUT_BLOCKED, NULL); - if (settings->menu.dpi.override_enable) - *dpi = settings->menu.dpi.override_value; - else if (!gfx_ctx_ctl(GFX_CTL_GET_METRICS, &metrics) || !*dpi) - *dpi = menu_dpi_override_value; - } - break; - case MENU_DISPLAY_CTL_INIT_FIRST_DRIVER: - { - unsigned i; + if (!libretro_input_is_blocked) + input_driver_ctl( + RARCH_INPUT_CTL_SET_LIBRETRO_INPUT_BLOCKED, NULL); - for (i = 0; menu_display_ctx_drivers[i]; i++) - { - if (!menu_display_check_compatibility( - menu_display_ctx_drivers[i]->type)) - continue; + core_run(); - RARCH_LOG("Found menu display driver: \"%s\".\n", - menu_display_ctx_drivers[i]->ident); - menu_disp = menu_display_ctx_drivers[i]; - return true; - } - } - return false; - case MENU_DISPLAY_CTL_RESTORE_CLEAR_COLOR: - if (!menu_disp || !menu_disp->restore_clear_color) - return false; - menu_disp->restore_clear_color(); - break; - case MENU_DISPLAY_CTL_CLEAR_COLOR: - if (!menu_disp || !menu_disp->clear_color) - return false; - menu_disp->clear_color((menu_display_ctx_clearcolor_t*)data); - break; - case MENU_DISPLAY_CTL_DRAW: - { - menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; - if (!menu_disp || !draw || !menu_disp->draw) - return false; - /* TODO - edge case */ - if (draw->height <= 0) - draw->height = 1; - - menu_disp->draw(draw); - } - break; - case MENU_DISPLAY_CTL_DRAW_PIPELINE: - { - menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; - if (!menu_disp || !draw || !menu_disp->draw_pipeline) - return false; - menu_disp->draw_pipeline(draw); - } - break; - case MENU_DISPLAY_CTL_DRAW_BG: - { - struct gfx_coords coords; - const float *new_vertex = NULL; - const float *new_tex_coord = NULL; - menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; - if (!menu_disp || !draw) - return false; - - new_vertex = draw->vertex; - new_tex_coord = draw->tex_coord; - - if (!new_vertex) - new_vertex = menu_disp->get_default_vertices(); - if (!new_tex_coord) - new_tex_coord = menu_disp->get_default_tex_coords(); - - coords.vertices = draw->vertex_count; - coords.vertex = new_vertex; - coords.tex_coord = new_tex_coord; - coords.lut_tex_coord = new_tex_coord; - coords.color = (const float*)draw->color; - - draw->coords = &coords; - - if (!draw->texture) - draw->texture = menu_display_white_texture; - - draw->matrix_data = (math_matrix_4x4*)menu_disp->get_default_mvp(); - } - break; - case MENU_DISPLAY_CTL_DRAW_GRADIENT: - { - menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; - - draw->texture = 0; - draw->x = 0; - draw->y = 0; - - menu_display_ctl(MENU_DISPLAY_CTL_DRAW_BG, draw); - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, draw); - } - break; - case MENU_DISPLAY_CTL_ROTATE_Z: - { - math_matrix_4x4 matrix_rotated, matrix_scaled; - math_matrix_4x4 *b = NULL; - menu_display_ctx_rotate_draw_t *draw = - (menu_display_ctx_rotate_draw_t*)data; - - if (!draw || !menu_disp || !menu_disp->get_default_mvp) - return false; - - b = (math_matrix_4x4*)menu_disp->get_default_mvp(); - - matrix_4x4_rotate_z(&matrix_rotated, draw->rotation); - matrix_4x4_multiply(draw->matrix, &matrix_rotated, b); - - if (!draw->scale_enable) - return false; - - matrix_4x4_scale(&matrix_scaled, - draw->scale_x, draw->scale_y, draw->scale_z); - matrix_4x4_multiply(draw->matrix, &matrix_scaled, draw->matrix); - } - break; - case MENU_DISPLAY_CTL_TEX_COORDS_GET: - { - menu_display_ctx_coord_draw_t *draw = - (menu_display_ctx_coord_draw_t*)data; - if (!draw) - return false; - - if (!menu_disp || !menu_disp->get_default_tex_coords) - return false; - - draw->ptr = menu_disp->get_default_tex_coords(); - } - break; - case MENU_DISPLAY_CTL_TIMEDATE: - menu_display_timedate(data); - break; - case MENU_DISPLAY_CTL_NONE: - default: - break; + input_driver_ctl( + RARCH_INPUT_CTL_UNSET_LIBRETRO_INPUT_BLOCKED, NULL); + return true; } + return video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); +} + +void menu_display_set_width(unsigned width) +{ + menu_display_framebuf_width = width; +} + +unsigned menu_display_get_width(void) +{ + return menu_display_framebuf_width; +} + +void menu_display_set_height(unsigned height) +{ + menu_display_framebuf_height = height; +} + +unsigned menu_display_get_height(void) +{ + return menu_display_framebuf_height; +} + +void menu_display_set_header_height(unsigned height) +{ + menu_display_header_height = height; +} + +unsigned menu_display_get_header_height(void) +{ + return menu_display_header_height; +} + +unsigned menu_display_get_font_size(void) +{ + return menu_display_font_size; +} + +void menu_display_set_font_size(unsigned size) +{ + menu_display_font_size = size; +} + +size_t menu_display_get_framebuffer_pitch(void) +{ + return menu_display_framebuf_pitch; +} + +void menu_display_set_framebuffer_pitch(size_t pitch) +{ + menu_display_framebuf_pitch = pitch; +} + +bool menu_display_get_msg_force(void) +{ + return menu_display_msg_force; +} + +void menu_display_set_msg_force(bool state) +{ + menu_display_msg_force = state; +} + +bool menu_display_get_font_data_init(void) +{ + return menu_display_font_alloc_framebuf; +} + +void menu_display_set_font_data_init(bool state) +{ + menu_display_font_alloc_framebuf = state; +} + +bool menu_display_get_update_pending(void) +{ + if (menu_animation_ctl(MENU_ANIMATION_CTL_IS_ACTIVE, NULL)) + return true; + if (menu_display_get_framebuffer_dirty_flag()) + return true; + return false; +} + +void menu_display_set_viewport(void) +{ + unsigned width, height; + video_driver_get_size(&width, &height); + video_driver_set_viewport(width, height, true, false); +} + +void menu_display_unset_viewport(void) +{ + unsigned width, height; + video_driver_get_size(&width, &height); + video_driver_set_viewport(width, height, false, true); +} + +bool menu_display_get_framebuffer_dirty_flag(void) +{ + return menu_display_framebuf_dirty; +} + +void menu_display_set_framebuffer_dirty_flag(void) +{ + menu_display_framebuf_dirty = true; +} + +void menu_display_unset_framebuffer_dirty_flag(void) +{ + menu_display_framebuf_dirty = false; +} + +float menu_display_get_dpi(void) +{ + settings_t *settings = config_get_ptr(); + gfx_ctx_metrics_t metrics; + float dpi = menu_dpi_override_value; + + if (!settings) + return true; + + metrics.type = DISPLAY_METRIC_DPI; + metrics.value = &dpi; + + if (settings->menu.dpi.override_enable) + return settings->menu.dpi.override_value; + else if (!gfx_ctx_ctl(GFX_CTL_GET_METRICS, &metrics) || !dpi) + return menu_dpi_override_value; + + return dpi; +} + +bool menu_display_init_first_driver(void) +{ + unsigned i; + + for (i = 0; menu_display_ctx_drivers[i]; i++) + { + if (!menu_display_check_compatibility( + menu_display_ctx_drivers[i]->type)) + continue; + + RARCH_LOG("Found menu display driver: \"%s\".\n", + menu_display_ctx_drivers[i]->ident); + menu_disp = menu_display_ctx_drivers[i]; + return true; + } + return false; +} + +bool menu_display_restore_clear_color(void) +{ + if (!menu_disp || !menu_disp->restore_clear_color) + return false; + menu_disp->restore_clear_color(); + return true; +} + +void menu_display_clear_color(menu_display_ctx_clearcolor_t *color) +{ + if (!menu_disp || !menu_disp->clear_color) + return; + menu_disp->clear_color(color); +} + +void menu_display_draw(menu_display_ctx_draw_t *draw) +{ + if (!menu_disp || !draw || !menu_disp->draw) + return; + + /* TODO - edge case */ + if (draw->height <= 0) + draw->height = 1; + + menu_disp->draw(draw); +} + +void menu_display_draw_pipeline(menu_display_ctx_draw_t *draw) +{ + if (!menu_disp || !draw || !menu_disp->draw_pipeline) + return; + menu_disp->draw_pipeline(draw); +} + +void menu_display_draw_bg(menu_display_ctx_draw_t *draw) +{ + struct gfx_coords coords; + const float *new_vertex = NULL; + const float *new_tex_coord = NULL; + if (!menu_disp || !draw) + return; + + new_vertex = draw->vertex; + new_tex_coord = draw->tex_coord; + + if (!new_vertex) + new_vertex = menu_disp->get_default_vertices(); + if (!new_tex_coord) + new_tex_coord = menu_disp->get_default_tex_coords(); + + coords.vertices = draw->vertex_count; + coords.vertex = new_vertex; + coords.tex_coord = new_tex_coord; + coords.lut_tex_coord = new_tex_coord; + coords.color = (const float*)draw->color; + + draw->coords = &coords; + + if (!draw->texture) + draw->texture = menu_display_white_texture; + + draw->matrix_data = (math_matrix_4x4*)menu_disp->get_default_mvp(); +} + +void menu_display_draw_gradient(menu_display_ctx_draw_t *draw) +{ + draw->texture = 0; + draw->x = 0; + draw->y = 0; + + menu_display_draw_bg(draw); + menu_display_draw(draw); +} + +void menu_display_rotate_z(menu_display_ctx_rotate_draw_t *draw) +{ + math_matrix_4x4 matrix_rotated, matrix_scaled; + math_matrix_4x4 *b = NULL; + + if (!draw || !menu_disp || !menu_disp->get_default_mvp) + return; + + b = (math_matrix_4x4*)menu_disp->get_default_mvp(); + + matrix_4x4_rotate_z(&matrix_rotated, draw->rotation); + matrix_4x4_multiply(draw->matrix, &matrix_rotated, b); + + if (!draw->scale_enable) + return; + + matrix_4x4_scale(&matrix_scaled, + draw->scale_x, draw->scale_y, draw->scale_z); + matrix_4x4_multiply(draw->matrix, &matrix_scaled, draw->matrix); +} + +bool menu_display_get_tex_coords(menu_display_ctx_coord_draw_t *draw) +{ + if (!draw) + return false; + + if (!menu_disp || !menu_disp->get_default_tex_coords) + return false; + + draw->ptr = menu_disp->get_default_tex_coords(); return true; } @@ -621,7 +579,7 @@ void menu_display_draw_cursor( bool cursor_visible = settings->video.fullscreen || !video_driver_ctl(RARCH_DISPLAY_CTL_HAS_WINDOWED, NULL); - if ( !settings->menu.mouse.enable) + if (!settings->menu.mouse.enable) return; if (!cursor_visible) return; @@ -632,7 +590,7 @@ void menu_display_draw_cursor( coords.lut_tex_coord = NULL; coords.color = (const float*)color; - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); + menu_display_blend_begin(); draw.x = x - (cursor_size / 2); draw.y = (int)height - y - (cursor_size / 2); @@ -643,8 +601,8 @@ void menu_display_draw_cursor( draw.texture = texture; draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP; - menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw); - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); + menu_display_draw(&draw); + menu_display_blend_end(); } static INLINE float menu_display_scalef(float val, @@ -668,7 +626,7 @@ void menu_display_push_quad( float vertex[8]; gfx_coord_array_t *ca = NULL; - menu_display_ctl(MENU_DISPLAY_CTL_COORDS_ARRAY_GET, &ca); + ca = menu_display_get_coords_array(); vertex[0] = x1 / (float)width; vertex[1] = y1 / (float)height; @@ -681,7 +639,7 @@ void menu_display_push_quad( coord_draw.ptr = NULL; - menu_display_ctl(MENU_DISPLAY_CTL_TEX_COORDS_GET, &coord_draw); + menu_display_get_tex_coords(&coord_draw); coords.color = colors; coords.vertex = vertex; @@ -794,8 +752,7 @@ void menu_display_draw_text(const char *msg, params->x = params->x; params->y = params->y; - menu_display_ctl(MENU_DISPLAY_CTL_FONT_BUF, &fb_buf); - + fb_buf = menu_display_get_font_buffer(); video_driver_set_osd_msg(msg, params, fb_buf); } diff --git a/menu/menu_display.h b/menu/menu_display.h index 2fd55f8162..2570ca432e 100644 --- a/menu/menu_display.h +++ b/menu/menu_display.h @@ -29,61 +29,6 @@ extern "C" { #endif -enum menu_display_ctl_state -{ - MENU_DISPLAY_CTL_NONE = 0, - MENU_DISPLAY_CTL_SET_VIEWPORT, - MENU_DISPLAY_CTL_UNSET_VIEWPORT, - MENU_DISPLAY_CTL_GET_FRAMEBUFFER_DIRTY_FLAG, - MENU_DISPLAY_CTL_SET_FRAMEBUFFER_DIRTY_FLAG, - MENU_DISPLAY_CTL_UNSET_FRAMEBUFFER_DIRTY_FLAG, - MENU_DISPLAY_CTL_GET_DPI, - MENU_DISPLAY_CTL_UPDATE_PENDING, - MENU_DISPLAY_CTL_WIDTH, - MENU_DISPLAY_CTL_HEIGHT, - MENU_DISPLAY_CTL_HEADER_HEIGHT, - MENU_DISPLAY_CTL_SET_HEADER_HEIGHT, - MENU_DISPLAY_CTL_SET_WIDTH, - MENU_DISPLAY_CTL_SET_HEIGHT, - MENU_DISPLAY_CTL_FB_PITCH, - MENU_DISPLAY_CTL_SET_FB_PITCH, - MENU_DISPLAY_CTL_LIBRETRO, - MENU_DISPLAY_CTL_LIBRETRO_RUNNING, - MENU_DISPLAY_CTL_SET_STUB_DRAW_FRAME, - MENU_DISPLAY_CTL_UNSET_STUB_DRAW_FRAME, - MENU_DISPLAY_CTL_FRAMEBUF_DEINIT, - MENU_DISPLAY_CTL_DEINIT, - MENU_DISPLAY_CTL_INIT, - MENU_DISPLAY_CTL_INIT_FIRST_DRIVER, - MENU_DISPLAY_CTL_FONT_DATA_INIT, - MENU_DISPLAY_CTL_SET_FONT_DATA_INIT, - MENU_DISPLAY_CTL_FONT_SIZE, - MENU_DISPLAY_CTL_SET_FONT_SIZE, - MENU_DISPLAY_CTL_MSG_FORCE, - MENU_DISPLAY_CTL_SET_MSG_FORCE, - MENU_DISPLAY_CTL_FONT_BUF, - MENU_DISPLAY_CTL_FONT_FLUSH_BLOCK, - MENU_DISPLAY_CTL_SET_FONT_BUF, - MENU_DISPLAY_CTL_FONT_FB, - MENU_DISPLAY_CTL_SET_FONT_FB, - MENU_DISPLAY_CTL_FONT_MAIN_DEINIT, - MENU_DISPLAY_CTL_FONT_MAIN_INIT, - MENU_DISPLAY_CTL_FONT_BIND_BLOCK, - MENU_DISPLAY_CTL_BLEND_BEGIN, - MENU_DISPLAY_CTL_BLEND_END, - MENU_DISPLAY_CTL_RESTORE_CLEAR_COLOR, - MENU_DISPLAY_CTL_CLEAR_COLOR, - MENU_DISPLAY_CTL_DRAW, - MENU_DISPLAY_CTL_DRAW_BG, - MENU_DISPLAY_CTL_DRAW_GRADIENT, - MENU_DISPLAY_CTL_DRAW_PIPELINE, - MENU_DISPLAY_CTL_ROTATE_Z, - MENU_DISPLAY_CTL_TEX_COORDS_GET, - MENU_DISPLAY_CTL_TIMEDATE, - MENU_DISPLAY_CTL_COORDS_ARRAY_RESET, - MENU_DISPLAY_CTL_COORDS_ARRAY_GET -}; - enum menu_display_prim_type { MENU_DISPLAY_PRIM_NONE = 0, @@ -177,7 +122,62 @@ typedef struct menu_display_ctx_font typedef uintptr_t menu_texture_item; -bool menu_display_ctl(enum menu_display_ctl_state state, void *data); +void menu_display_blend_begin(void); +void menu_display_blend_end(void); + +void menu_display_font_main_deinit(void); +bool menu_display_font_main_init(menu_display_ctx_font_t *font); +void menu_display_font_bind_block(void *block); +bool menu_display_font_flush_block(void); + +void menu_display_framebuffer_deinit(void); + +void menu_display_deinit(void); +bool menu_display_init(void); + +void menu_display_coords_array_reset(void); +gfx_coord_array_t *menu_display_get_coords_array(void); +void *menu_display_get_font_buffer(void); +void menu_display_set_font_buffer(void *buffer); +const uint8_t *menu_display_get_font_framebuffer(void); +void menu_display_set_font_framebuffer(const uint8_t *buffer); +bool menu_display_libretro_running(void); +bool menu_display_libretro(void); + +void menu_display_set_width(unsigned width); +unsigned menu_display_get_width(void); +void menu_display_set_height(unsigned height); +unsigned menu_display_get_height(void); +void menu_display_set_header_height(unsigned height); +unsigned menu_display_get_header_height(void); +unsigned menu_display_get_font_size(void); +void menu_display_set_font_size(unsigned size); +size_t menu_display_get_framebuffer_pitch(void); +void menu_display_set_framebuffer_pitch(size_t pitch); + +bool menu_display_get_msg_force(void); +void menu_display_set_msg_force(bool state); +bool menu_display_get_font_data_init(void); +void menu_display_set_font_data_init(bool state); +bool menu_display_get_update_pending(void); +void menu_display_set_viewport(void); +void menu_display_unset_viewport(void); +bool menu_display_get_framebuffer_dirty_flag(void); +void menu_display_set_framebuffer_dirty_flag(void); +void menu_display_unset_framebuffer_dirty_flag(void); +float menu_display_get_dpi(void); +bool menu_display_init_first_driver(void); +bool menu_display_restore_clear_color(void); +void menu_display_clear_color(menu_display_ctx_clearcolor_t *color); +void menu_display_draw(menu_display_ctx_draw_t *draw); + +void menu_display_draw_pipeline(menu_display_ctx_draw_t *draw); +void menu_display_draw_bg(menu_display_ctx_draw_t *draw); +void menu_display_draw_gradient(menu_display_ctx_draw_t *draw); +void menu_display_rotate_z(menu_display_ctx_rotate_draw_t *draw); +bool menu_display_get_tex_coords(menu_display_ctx_coord_draw_t *draw); + +void menu_display_timedate(menu_display_ctx_datetime_t *datetime); void menu_display_handle_wallpaper_upload(void *task_data, void *user_data, const char *err); diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 1f0517c450..13c08da017 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -185,7 +185,7 @@ static bool menu_init(menu_handle_t *menu_data) menu_driver_ctl(RARCH_MENU_CTL_SHADER_MANAGER_INIT, NULL); - if (!menu_display_ctl(MENU_DISPLAY_CTL_INIT, NULL)) + if (!menu_display_init()) return false; return true; @@ -445,7 +445,7 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) BIT64_SET(menu_driver_data->state, MENU_STATE_RENDER_FRAMEBUFFER); if (BIT64_GET(menu_driver_data->state, MENU_STATE_RENDER_FRAMEBUFFER)) - menu_display_ctl(MENU_DISPLAY_CTL_SET_FRAMEBUFFER_DIRTY_FLAG, NULL); + menu_display_set_framebuffer_dirty_flag(); if (BIT64_GET(menu_driver_data->state, MENU_STATE_RENDER_MESSAGEBOX) && !string_is_empty(menu_driver_data->menu_state.msg)) @@ -468,7 +468,7 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) if (menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL) && !runloop_ctl(RUNLOOP_CTL_IS_IDLE, NULL)) - menu_display_ctl(MENU_DISPLAY_CTL_LIBRETRO, NULL); + menu_display_libretro(); menu_driver_ctl(RARCH_MENU_CTL_SET_TEXTURE, NULL); @@ -562,7 +562,7 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) menu_userdata = NULL; menu_driver_ctl(RARCH_MENU_CTL_SYSTEM_INFO_DEINIT, NULL); - menu_display_ctl(MENU_DISPLAY_CTL_DEINIT, NULL); + menu_display_deinit(); menu_entries_ctl(MENU_ENTRIES_CTL_DEINIT, NULL); event_cmd_ctl(EVENT_CMD_HISTORY_DEINIT, NULL); @@ -836,11 +836,9 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data) if (menu_driver_ctl(RARCH_MENU_CTL_IS_PENDING_QUICK_MENU, NULL)) { - bool msg_force = true; - menu_driver_ctl(RARCH_MENU_CTL_UNSET_PENDING_QUICK_MENU, NULL); menu_entries_flush_stack(NULL, MENU_SETTINGS); - menu_display_ctl(MENU_DISPLAY_CTL_SET_MSG_FORCE, &msg_force); + menu_display_set_msg_force(true); generic_action_ok_displaylist_push("", "", 0, 0, 0, ACTION_OK_DL_CONTENT_SETTINGS); diff --git a/menu/menu_input.c b/menu/menu_input.c index 5747af9f32..78f8581592 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -825,8 +825,8 @@ static int menu_input_pointer(unsigned *action) const struct retro_keybind *binds[MAX_USERS] = {NULL}; menu_input_t *menu_input = menu_input_get_ptr(); - menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); + fb_width = menu_display_get_width(); + fb_height = menu_display_get_height(); pointer_device = menu_driver_ctl(RARCH_MENU_CTL_IS_SET_TEXTURE, NULL) ? RETRO_DEVICE_POINTER : RARCH_DEVICE_POINTER_SCREEN; @@ -940,7 +940,7 @@ static int menu_input_mouse_post_iterate(uint64_t *input_mouse, menu_input_t *menu_input = menu_input_get_ptr(); menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection); - menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); + header_height = menu_display_get_header_height(); BIT64_SET(*input_mouse, MENU_MOUSE_ACTION_BUTTON_L); @@ -1068,7 +1068,6 @@ static int menu_input_pointer_post_iterate( menu_file_list_cbs_t *cbs, menu_entry_t *entry, unsigned action) { - unsigned header_height; size_t selection; static bool pointer_oldpressed[2]; static bool pointer_oldback = false; @@ -1088,7 +1087,6 @@ static int menu_input_pointer_post_iterate( return -1; if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) return -1; - menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); #ifdef HAVE_OVERLAY check_overlay = check_overlay || From ade5131833d4bcc11da57e497d2fdde81105c8f4 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sun, 8 May 2016 12:43:58 +0200 Subject: [PATCH 5/8] Vulkan: Move to SPIRV-Cross. --- .gitmodules | 6 +++--- Makefile.common | 8 ++++---- deps/SPIRV-Cross | 1 + gfx/drivers_shader/slang_reflection.cpp | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) create mode 160000 deps/SPIRV-Cross diff --git a/.gitmodules b/.gitmodules index 49f252a8ef..71d65bba2f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "deps/glslang/glslang"] path = deps/glslang/glslang url = git://github.com/KhronosGroup/glslang.git -[submodule "deps/spir2cross"] - path = deps/spir2cross - url = git://github.com/ARM-software/spir2cross +[submodule "deps/SPIRV-Cross"] + path = deps/SPIRV-Cross + url = git://github.com/KhronosGroup/SPIRV-Cross diff --git a/Makefile.common b/Makefile.common index 7ea3441a0f..39c1b13713 100644 --- a/Makefile.common +++ b/Makefile.common @@ -752,7 +752,7 @@ ifeq ($(HAVE_VULKAN), 1) $(wildcard deps/glslang/glslang/glslang/MachineIndependent/preprocessor/*.cpp) \ $(wildcard deps/glslang/glslang/glslang/OSDependent/$(GLSLANG_PLATFORM)/*.cpp) - SPIR2CROSS_SOURCES := deps/spir2cross/spir2cross.cpp + SPIRV_CROSS_SOURCES := deps/SPIRV-Cross/spirv_cross.cpp DEFINES += \ -Ideps/glslang/glslang/glslang/OSDependent/$(GLSLANG_PLATFORM) \ @@ -761,13 +761,13 @@ ifeq ($(HAVE_VULKAN), 1) -Ideps/glslang/glslang/glslang/Public \ -Ideps/glslang/glslang/SPIRV \ -Ideps/glslang \ - -Ideps/spir2cross + -Ideps/SPIRV-Cross CXXFLAGS += -Wno-switch -Wno-sign-compare -fno-strict-aliasing -Wno-maybe-uninitialized -Wno-reorder -I./gfx/include/vulkan CFLAGS += -I./gfx/include/vulkan GLSLANG_OBJ := $(GLSLANG_SOURCES:.cpp=.o) - SPIR2CROSS_OBJ := $(SPIR2CROSS_SOURCES:.cpp=.o) + SPIRV_CROSS_OBJ := $(SPIRV_CROSS_SOURCES:.cpp=.o) OBJ += gfx/drivers/vulkan.o \ gfx/common/vulkan_common.o \ @@ -776,7 +776,7 @@ ifeq ($(HAVE_VULKAN), 1) gfx/drivers_shader/glslang_util.o \ gfx/drivers_shader/slang_reflection.o \ $(GLSLANG_OBJ) \ - $(SPIR2CROSS_OBJ) + $(SPIRV_CROSS_OBJ) ifeq ($(HAVE_MENU_COMMON), 1) OBJ += menu/drivers_display/menu_display_vulkan.o endif diff --git a/deps/SPIRV-Cross b/deps/SPIRV-Cross new file mode 160000 index 0000000000..44ef367141 --- /dev/null +++ b/deps/SPIRV-Cross @@ -0,0 +1 @@ +Subproject commit 44ef367141f9935bc719c9cc25693a9055f61efa diff --git a/gfx/drivers_shader/slang_reflection.cpp b/gfx/drivers_shader/slang_reflection.cpp index 0715850fb7..748f11e00d 100644 --- a/gfx/drivers_shader/slang_reflection.cpp +++ b/gfx/drivers_shader/slang_reflection.cpp @@ -13,14 +13,14 @@ * If not, see . */ -#include "spir2cross.hpp" +#include "spirv_cross.hpp" #include "slang_reflection.hpp" #include #include #include "../../verbosity.h" using namespace std; -using namespace spir2cross; +using namespace spirv_cross; static bool slang_texture_semantic_is_array(slang_texture_semantic sem) { From d7234114365ebed8f4ce3b1224e87a81ceb01584 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sun, 8 May 2016 14:00:51 +0200 Subject: [PATCH 6/8] De ioctl video_driver. --- command_event.c | 39 +- configuration.c | 6 +- core_impl.c | 2 +- driver.c | 31 +- dynamic.c | 8 +- gfx/common/vulkan_common.c | 4 +- gfx/drivers/gl.c | 31 +- gfx/drivers/sdl_gfx.c | 11 +- gfx/drivers/vulkan.c | 16 +- gfx/drivers_context/drm_ctx.c | 4 +- gfx/drivers_context/wayland_ctx.c | 4 +- gfx/drivers_context/x_ctx.c | 10 +- gfx/drivers_context/xegl_ctx.c | 2 +- gfx/drivers_font/gl_raster_font.c | 2 +- gfx/font_driver.c | 2 +- gfx/video_context_driver.c | 3 +- gfx/video_driver.c | 1254 ++++++++++++++++------------- gfx/video_driver.h | 142 ++-- gfx/video_texture_image.c | 3 +- input/drivers/x11_input.c | 6 +- input/input_driver.c | 2 +- menu/cbs/menu_cbs_left.c | 3 +- menu/cbs/menu_cbs_right.c | 3 +- menu/drivers/materialui.c | 5 +- menu/drivers/rgui.c | 4 +- menu/drivers/xmb.c | 3 +- menu/drivers/zarch.c | 3 +- menu/menu_display.c | 4 +- menu/menu_setting.c | 23 +- record/record_driver.c | 25 +- retroarch.c | 2 +- runloop.c | 14 +- screenshot.c | 16 +- 33 files changed, 868 insertions(+), 819 deletions(-) diff --git a/command_event.c b/command_event.c index e5906d5be2..b91f71b738 100644 --- a/command_event.c +++ b/command_event.c @@ -1131,21 +1131,17 @@ bool event_cmd_ctl(enum event_command cmd, void *data) break; case EVENT_CMD_REINIT: { - struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); if (hwr->cache_context) - video_driver_ctl( - RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT, NULL); + video_driver_set_video_cache_context(); else - video_driver_ctl( - RARCH_DISPLAY_CTL_UNSET_VIDEO_CACHE_CONTEXT, NULL); + video_driver_unset_video_cache_context(); - video_driver_ctl( - RARCH_DISPLAY_CTL_UNSET_VIDEO_CACHE_CONTEXT_ACK, NULL); + video_driver_unset_video_cache_context_ack(); event_cmd_ctl(EVENT_CMD_RESET_CONTEXT, NULL); - video_driver_ctl( - RARCH_DISPLAY_CTL_UNSET_VIDEO_CACHE_CONTEXT, NULL); + video_driver_unset_video_cache_context(); /* Poll input to avoid possibly stale data to corrupt things. */ input_driver_ctl(RARCH_INPUT_CTL_POLL, NULL); @@ -1276,7 +1272,7 @@ bool event_cmd_ctl(enum event_command cmd, void *data) audio_driver_dsp_filter_init(settings->path.audio_dsp_plugin); break; case EVENT_CMD_GPU_RECORD_DEINIT: - video_driver_ctl(RARCH_DISPLAY_CTL_GPU_RECORD_DEINIT, NULL); + video_driver_gpu_record_deinit(); break; case EVENT_CMD_RECORD_DEINIT: if (!recording_deinit()) @@ -1317,8 +1313,8 @@ bool event_cmd_ctl(enum event_command cmd, void *data) break; case EVENT_CMD_CORE_DEINIT: { - struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + struct retro_hw_render_callback *hwr = + hwr = video_driver_get_hw_context(); event_deinit_core(true); if (hwr) @@ -1331,15 +1327,15 @@ bool event_cmd_ctl(enum event_command cmd, void *data) return false; break; case EVENT_CMD_VIDEO_APPLY_STATE_CHANGES: - video_driver_ctl(RARCH_DISPLAY_CTL_APPLY_STATE_CHANGES, NULL); + video_driver_apply_state_changes(); break; case EVENT_CMD_VIDEO_SET_NONBLOCKING_STATE: boolean = true; /* fall-through */ case EVENT_CMD_VIDEO_SET_BLOCKING_STATE: - video_driver_ctl(RARCH_DISPLAY_CTL_SET_NONBLOCK_STATE, &boolean); + video_driver_set_nonblock_state(boolean); break; case EVENT_CMD_VIDEO_SET_ASPECT_RATIO: - video_driver_ctl(RARCH_DISPLAY_CTL_SET_ASPECT_RATIO, NULL); + video_driver_set_aspect_ratio(); break; case EVENT_CMD_AUDIO_SET_NONBLOCKING_STATE: boolean = true; /* fall-through */ @@ -1371,8 +1367,7 @@ bool event_cmd_ctl(enum event_command cmd, void *data) struct retro_hw_render_callback hwr_copy; int flags = DRIVERS_CMD_ALL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); - + hwr = video_driver_get_hw_context(); memcpy(&hwr_copy, hwr, sizeof(hwr_copy)); driver_ctl(RARCH_DRIVER_CTL_UNINIT, &flags); @@ -1427,7 +1422,7 @@ bool event_cmd_ctl(enum event_command cmd, void *data) event_cmd_ctl(EVENT_CMD_AUDIO_STOP, NULL); if (settings->video.black_frame_insertion) - video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); + video_driver_cached_frame_render(); } else { @@ -1563,7 +1558,7 @@ bool event_cmd_ctl(enum event_command cmd, void *data) #endif break; case EVENT_CMD_FULLSCREEN_TOGGLE: - if (!video_driver_ctl(RARCH_DISPLAY_CTL_HAS_WINDOWED, NULL)) + if (!video_driver_has_windowed()) return false; /* If we go fullscreen we drop all drivers and @@ -1694,9 +1689,9 @@ bool event_cmd_ctl(enum event_command cmd, void *data) grab_mouse_state ? "yes" : "no"); if (grab_mouse_state) - video_driver_ctl(RARCH_DISPLAY_CTL_HIDE_MOUSE, NULL); + video_driver_hide_mouse(); else - video_driver_ctl(RARCH_DISPLAY_CTL_SHOW_MOUSE, NULL); + video_driver_show_mouse(); } break; case EVENT_CMD_PERFCNT_REPORT_FRONTEND_LOG: diff --git a/configuration.c b/configuration.c index f740debfc8..219cd5138b 100644 --- a/configuration.c +++ b/configuration.c @@ -720,7 +720,7 @@ static void config_set_defaults(void) settings->set_supports_no_game_enable = true; - video_driver_ctl(RARCH_DISPLAY_CTL_RESET_CUSTOM_VIEWPORT, NULL); + video_driver_reset_custom_viewport(); /* Make sure settings from other configs carry over into defaults * for another config. */ @@ -803,7 +803,7 @@ static void config_set_defaults(void) global->console.sound.system_bgm_enable = false; - video_driver_ctl(RARCH_DISPLAY_CTL_DEFAULT_SETTINGS, NULL); + video_driver_default_settings(); if (*g_defaults.dir.wallpapers) strlcpy(settings->directory.dynamic_wallpapers, @@ -2846,7 +2846,7 @@ bool config_save_file(const char *path) config_set_int(conf, "custom_viewport_y", settings->video_viewport_custom.y); - video_driver_ctl(RARCH_DISPLAY_CTL_SAVE_SETTINGS, conf); + video_driver_save_settings(conf); config_set_float(conf, "video_font_size", settings->video.font_size); diff --git a/core_impl.c b/core_impl.c index 277b211475..fe3745758c 100644 --- a/core_impl.c +++ b/core_impl.c @@ -335,7 +335,7 @@ bool core_unload(void) bool core_unload_game(void) { - video_driver_ctl(RARCH_DISPLAY_CTL_DEINIT_HW_CONTEXT, NULL); + video_driver_deinit_hw_context(); audio_driver_ctl(RARCH_AUDIO_CTL_STOP, NULL); core.retro_unload_game(); return true; diff --git a/driver.c b/driver.c index a6e26e3c00..6a4f3c94af 100644 --- a/driver.c +++ b/driver.c @@ -201,7 +201,7 @@ bool driver_find_next(const char *label, char *s, size_t len) static void driver_adjust_system_rates(void) { audio_driver_ctl(RARCH_AUDIO_CTL_MONITOR_ADJUST_SYSTEM_RATES, NULL); - video_driver_ctl(RARCH_DISPLAY_CTL_MONITOR_ADJUST_SYSTEM_RATES, NULL); + video_driver_monitor_adjust_system_rates(); if (!video_driver_get_ptr(false)) return; @@ -227,15 +227,14 @@ static void driver_set_nonblock_state(void) RARCH_INPUT_CTL_IS_NONBLOCK_STATE, NULL); /* Only apply non-block-state for video if we're using vsync. */ - if (video_driver_ctl(RARCH_DISPLAY_CTL_IS_ACTIVE, NULL) - && video_driver_get_ptr(false)) + if (video_driver_is_active() && video_driver_get_ptr(false)) { bool video_nonblock = enable; if ( !settings->video.vsync || runloop_ctl(RUNLOOP_CTL_IS_NONBLOCK_FORCED, NULL)) video_nonblock = true; - video_driver_ctl(RARCH_DISPLAY_CTL_SET_NONBLOCK_STATE, &video_nonblock); + video_driver_set_nonblock_state(video_nonblock); } audio_driver_set_nonblocking_state(enable); @@ -303,7 +302,7 @@ static void menu_update_libretro_info(void) static void init_drivers(int flags) { if (flags & DRIVER_VIDEO) - video_driver_ctl(RARCH_DISPLAY_CTL_UNSET_OWN_DRIVER, NULL); + video_driver_unset_own_driver(); if (flags & DRIVER_AUDIO) audio_driver_ctl(RARCH_AUDIO_CTL_UNSET_OWN_DRIVER, NULL); if (flags & DRIVER_INPUT) @@ -323,16 +322,16 @@ static void init_drivers(int flags) if (flags & DRIVER_VIDEO) { - struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); - video_driver_ctl(RARCH_DISPLAY_CTL_MONITOR_RESET, NULL); - video_driver_ctl(RARCH_DISPLAY_CTL_INIT, NULL); + video_driver_monitor_reset(); + video_driver_init(); - if (!video_driver_ctl(RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT_ACK, NULL) + if (!video_driver_is_video_cache_context_ack() && hwr->context_reset) hwr->context_reset(); - video_driver_ctl(RARCH_DISPLAY_CTL_UNSET_VIDEO_CACHE_CONTEXT_ACK, NULL); + video_driver_unset_video_cache_context_ack(); runloop_ctl(RUNLOOP_CTL_SET_FRAME_TIME_LAST, NULL); } @@ -411,10 +410,10 @@ static void uninit_drivers(int flags) audio_driver_ctl(RARCH_AUDIO_CTL_DEINIT, NULL); if (flags & DRIVERS_VIDEO_INPUT) - video_driver_ctl(RARCH_DISPLAY_CTL_DEINIT, NULL); + video_driver_deinit(); - if ((flags & DRIVER_VIDEO) && !video_driver_ctl(RARCH_DISPLAY_CTL_OWNS_DRIVER, NULL)) - video_driver_ctl(RARCH_DISPLAY_CTL_DESTROY_DATA, NULL); + if ((flags & DRIVER_VIDEO) && !video_driver_owns_driver()) + video_driver_destroy_data(); if ((flags & DRIVER_INPUT) && !input_driver_ctl(RARCH_INPUT_CTL_OWNS_DRIVER, NULL)) input_driver_ctl(RARCH_INPUT_CTL_DESTROY_DATA, NULL); @@ -428,7 +427,7 @@ bool driver_ctl(enum driver_ctl_state state, void *data) switch (state) { case RARCH_DRIVER_CTL_DEINIT: - video_driver_ctl(RARCH_DISPLAY_CTL_DESTROY, NULL); + video_driver_destroy(); audio_driver_ctl(RARCH_AUDIO_CTL_DESTROY, NULL); input_driver_ctl(RARCH_INPUT_CTL_DESTROY, NULL); #ifdef HAVE_MENU @@ -466,7 +465,7 @@ bool driver_ctl(enum driver_ctl_state state, void *data) } case RARCH_DRIVER_CTL_INIT_PRE: audio_driver_ctl(RARCH_AUDIO_CTL_FIND_DRIVER, NULL); - video_driver_ctl(RARCH_DISPLAY_CTL_FIND_DRIVER, NULL); + video_driver_find_driver(); input_driver_ctl(RARCH_INPUT_CTL_FIND_DRIVER, NULL); camera_driver_ctl(RARCH_CAMERA_CTL_FIND_DRIVER, NULL); find_location_driver(); diff --git a/dynamic.c b/dynamic.c index 02bfb5a782..03ca24106b 100644 --- a/dynamic.c +++ b/dynamic.c @@ -911,7 +911,7 @@ bool rarch_environment_cb(unsigned cmd, void *data) struct retro_hw_render_callback *cb = (struct retro_hw_render_callback*)data; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + hwr = video_driver_get_hw_context(); RARCH_LOG("Environ SET_HW_RENDER.\n"); @@ -1253,13 +1253,11 @@ bool rarch_environment_cb(unsigned cmd, void *data) } case RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER: - return video_driver_ctl( - RARCH_DISPLAY_CTL_GET_CURRENT_SOFTWARE_FRAMEBUFFER, + return video_driver_get_current_software_framebuffer( (struct retro_framebuffer*)data); case RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE: - return video_driver_ctl( - RARCH_DISPLAY_CTL_GET_HW_RENDER_INTERFACE, + return video_driver_get_hw_render_interface( (const struct retro_hw_render_interface**)data); /* Private extensions for internal use, not part of libretro API. */ diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index 4bd77e93c9..7f232211b1 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -1373,7 +1373,7 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk, vk->context.device = cached_device; cached_device = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT_ACK, NULL); + video_driver_set_video_cache_context_ack(); RARCH_LOG("[Vulkan]: Using cached Vulkan context.\n"); } else if (VKFUNC(vkCreateDevice)(vk->context.gpu, &device_info, @@ -1614,7 +1614,7 @@ void vulkan_context_destroy(gfx_ctx_vulkan_data_t *vk, vk->context.swapchain_fences[i], NULL); } - if (video_driver_ctl(RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT, NULL)) + if (video_driver_is_video_cache_context()) { cached_device = vk->context.device; cached_instance = vk->context.instance; diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index e575932360..68da573c1d 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -755,8 +755,8 @@ static bool gl_init_hw_render(gl_t *gl, unsigned width, unsigned height) bool stencil = false; GLint max_fbo_size = 0; GLint max_renderbuffer_size = 0; - struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); /* We can only share texture objects through contexts. * FBOs are "abstract" objects and are not shared. */ @@ -2157,8 +2157,8 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) #if defined(HAVE_GL_SYNC) || defined(HAVE_FBO) settings_t *settings = config_get_ptr(); #endif - struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); (void)vendor; (void)renderer; @@ -2222,7 +2222,7 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) RARCH_LOG("[GL]: Using ARB_sync to reduce latency.\n"); #endif - video_driver_ctl(RARCH_DISPLAY_CTL_UNSET_RGBA, NULL); + video_driver_unset_rgba(); #if defined(HAVE_OPENGLES) || defined(HAVE_OPENGLES2) bool gles3 = false; @@ -2329,8 +2329,7 @@ static INLINE void gl_set_texture_fmts(gl_t *gl, bool rgb32) if (rgb32) { - bool use_rgba = - video_driver_ctl(RARCH_DISPLAY_CTL_SUPPORTS_RGBA, NULL); + bool use_rgba = video_driver_supports_rgba(); gl->internal_fmt = RARCH_GL_INTERNAL_FORMAT32; gl->texture_type = RARCH_GL_TEXTURE_TYPE32; @@ -2417,7 +2416,7 @@ static const gfx_ctx_driver_t *gl_get_context(gl_t *gl) struct retro_hw_render_callback *hwr = NULL; settings_t *settings = config_get_ptr(); - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + hwr = video_driver_get_hw_context(); major = hwr->version_major; minor = hwr->version_minor; @@ -2695,7 +2694,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo RARCH_LOG("GL: Using resolution %ux%u\n", temp_width, temp_height); - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + hwr = video_driver_get_hw_context(); gl->vertex_ptr = hwr->bottom_left_origin ? vertexes : vertexes_flipped; @@ -3176,7 +3175,7 @@ static bool gl_read_viewport(void *data, uint8_t *buffer) goto error; } - video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); + video_driver_cached_frame_render(); video_frame_convert_rgba_to_bgr( (const void*)gl->readback_buffer_screenshot, @@ -3268,7 +3267,7 @@ void gl_load_texture_data(uint32_t id_data, { GLint mag_filter, min_filter; bool want_mipmap = false; - bool use_rgba = video_driver_ctl(RARCH_DISPLAY_CTL_SUPPORTS_RGBA, NULL); + bool use_rgba = video_driver_supports_rgba(); bool rgb32 = (base_size == (sizeof(uint32_t))); GLenum wrap = gl_wrap_type_to_enum(wrap_type); GLuint id = (GLuint)id_data; @@ -3588,29 +3587,25 @@ static retro_proc_address_t gl_get_proc_address(void *data, const char *sym) static void gl_set_aspect_ratio(void *data, unsigned aspect_ratio_idx) { gl_t *gl = (gl_t*)data; - enum rarch_display_ctl_state cmd = RARCH_DISPLAY_CTL_NONE; switch (aspect_ratio_idx) { case ASPECT_RATIO_SQUARE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL; + video_driver_set_viewport_square_pixel(); break; case ASPECT_RATIO_CORE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE; + video_driver_set_viewport_core(); break; case ASPECT_RATIO_CONFIG: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG; + video_driver_set_viewport_config(); break; default: break; } - if (cmd != RARCH_DISPLAY_CTL_NONE) - video_driver_ctl(cmd, NULL); - video_driver_set_aspect_ratio_value( aspectratio_lut[aspect_ratio_idx].value); diff --git a/gfx/drivers/sdl_gfx.c b/gfx/drivers/sdl_gfx.c index 0af2e7c3b2..fe238fa8c9 100644 --- a/gfx/drivers/sdl_gfx.c +++ b/gfx/drivers/sdl_gfx.c @@ -433,29 +433,24 @@ static void sdl_set_filtering(void *data, unsigned index, bool smooth) static void sdl_set_aspect_ratio(void *data, unsigned aspect_ratio_idx) { - enum rarch_display_ctl_state cmd = RARCH_DISPLAY_CTL_NONE; - switch (aspect_ratio_idx) { case ASPECT_RATIO_SQUARE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL; + video_driver_set_viewport_square_pixel(); break; case ASPECT_RATIO_CORE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE; + video_driver_set_viewport_core(); break; case ASPECT_RATIO_CONFIG: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG; + video_driver_set_viewport_config(); break; default: break; } - if (cmd != RARCH_DISPLAY_CTL_NONE) - video_driver_ctl(cmd, NULL); - video_driver_set_aspect_ratio_value(aspectratio_lut[aspect_ratio_idx].value); } diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index e2bb1403d3..8740a7ae50 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -896,8 +896,8 @@ static void vulkan_init_hw_render(vk_t *vk) { struct retro_hw_render_interface_vulkan *iface = &vk->hw.iface; - struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); if (hwr->context_type != RETRO_HW_CONTEXT_VULKAN) return; @@ -1770,29 +1770,25 @@ static bool vulkan_frame(void *data, const void *frame, static void vulkan_set_aspect_ratio(void *data, unsigned aspect_ratio_idx) { vk_t *vk = (vk_t*)data; - enum rarch_display_ctl_state cmd = RARCH_DISPLAY_CTL_NONE; switch (aspect_ratio_idx) { case ASPECT_RATIO_SQUARE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL; + video_driver_set_viewport_square_pixel(); break; case ASPECT_RATIO_CORE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE; + video_driver_set_viewport_core(); break; case ASPECT_RATIO_CONFIG: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG; + video_driver_set_viewport_config(); break; default: break; } - if (cmd != RARCH_DISPLAY_CTL_NONE) - video_driver_ctl(cmd, NULL); - video_driver_set_aspect_ratio_value( aspectratio_lut[aspect_ratio_idx].value); @@ -2081,7 +2077,7 @@ static bool vulkan_read_viewport(void *data, uint8_t *buffer) * with conversion. */ vk->readback.pending = true; - video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); + video_driver_cached_frame_render(); VKFUNC(vkQueueWaitIdle)(vk->context->queue); if (!staging->mapped) diff --git a/gfx/drivers_context/drm_ctx.c b/gfx/drivers_context/drm_ctx.c index b6d3ba4b89..edd1c63a13 100644 --- a/gfx/drivers_context/drm_ctx.c +++ b/gfx/drivers_context/drm_ctx.c @@ -468,9 +468,7 @@ static EGLint *gfx_ctx_drm_egl_fill_attribs( #ifdef GL_DEBUG debug = true; #else - struct retro_hw_render_callback *hwr = NULL; - - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + struct retro_hw_render_callback *hwr = video_driver_get_hw_context(); debug = hwr->debug_context; #endif diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c index f7fedd1f22..7098916b39 100644 --- a/gfx/drivers_context/wayland_ctx.c +++ b/gfx/drivers_context/wayland_ctx.c @@ -639,8 +639,8 @@ static EGLint *egl_fill_attribs(gfx_ctx_wayland_data_t *wl, EGLint *attr) #ifdef GL_DEBUG debug = true; #else - struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); debug = hwr->debug_context; #endif diff --git a/gfx/drivers_context/x_ctx.c b/gfx/drivers_context/x_ctx.c index b86f1d8b95..3abf1bda62 100644 --- a/gfx/drivers_context/x_ctx.c +++ b/gfx/drivers_context/x_ctx.c @@ -91,7 +91,7 @@ static void gfx_ctx_x_destroy_resources(gfx_ctx_x_data_t *x) glFinish(); glXMakeContextCurrent(g_x11_dpy, None, None, NULL); - if (!video_driver_ctl(RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT, NULL)) + if (!video_driver_is_video_cache_context()) { if (x->g_hw_ctx) glXDestroyContext(g_x11_dpy, x->g_hw_ctx); @@ -139,7 +139,7 @@ static void gfx_ctx_x_destroy_resources(gfx_ctx_x_data_t *x) x->g_should_reset_mode = false; } - if (!video_driver_ctl(RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT, NULL) + if (!video_driver_is_video_cache_context() && g_x11_dpy) { XCloseDisplay(g_x11_dpy); @@ -333,8 +333,8 @@ static void *gfx_ctx_x_init(void *data) gfx_ctx_x_data_t *x = (gfx_ctx_x_data_t*) calloc(1, sizeof(gfx_ctx_x_data_t)); #ifndef GL_DEBUG - struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); #endif if (!x) @@ -646,7 +646,7 @@ static bool gfx_ctx_x_set_video_mode(void *data, } else { - video_driver_ctl(RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT_ACK, NULL); + video_driver_set_video_cache_context_ack(); RARCH_LOG("[GLX]: Using cached GL context.\n"); } diff --git a/gfx/drivers_context/xegl_ctx.c b/gfx/drivers_context/xegl_ctx.c index 9bacb5ce5d..4665258f4f 100644 --- a/gfx/drivers_context/xegl_ctx.c +++ b/gfx/drivers_context/xegl_ctx.c @@ -194,7 +194,7 @@ static EGLint *xegl_fill_attribs(xegl_ctx_data_t *xegl, EGLint *attr) bool core = version >= 3001; struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + hwr = video_driver_get_hw_context(); #ifdef GL_DEBUG debug = true; #else diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index 89c9259b69..0a30b0e6fb 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -61,7 +61,7 @@ static bool gl_raster_font_upload_atlas(gl_raster_t *font, struct retro_hw_render_callback *hwr = NULL; bool ancient = false; /* add a check here if needed */ - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + hwr = video_driver_get_hw_context(); if (ancient) { diff --git a/gfx/font_driver.c b/gfx/font_driver.c index f92d0b4187..b496d60530 100644 --- a/gfx/font_driver.c +++ b/gfx/font_driver.c @@ -312,7 +312,7 @@ bool font_driver_init_first( if (threading_hint && settings->video.threaded - && !video_driver_ctl(RARCH_DISPLAY_CTL_IS_HW_CONTEXT, NULL)) + && !video_driver_is_hw_context()) return rarch_threaded_video_font_init(new_font_driver, new_font_handle, data, font_path, font_size, api, font_init_first); #endif diff --git a/gfx/video_context_driver.c b/gfx/video_context_driver.c index 65f700efc1..b009d8dea5 100644 --- a/gfx/video_context_driver.c +++ b/gfx/video_context_driver.c @@ -266,8 +266,7 @@ bool gfx_ctx_ctl(enum gfx_ctx_ctl_state state, void *data) { uint64_t *frame_count = NULL; gfx_ctx_size_t *size_data = (gfx_ctx_size_t*)data; - - video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); + frame_count = video_driver_get_frame_count_ptr(); if (!video_context_data || !size_data) return false; diff --git a/gfx/video_driver.c b/gfx/video_driver.c index e0946c2015..f8ca8f9abe 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -286,7 +286,7 @@ void *video_driver_get_ptr(bool force_nonthreaded_data) settings_t *settings = config_get_ptr(); if (settings->video.threaded - && !(video_driver_ctl(RARCH_DISPLAY_CTL_IS_HW_CONTEXT, NULL)) + && !video_driver_is_hw_context() && !force_nonthreaded_data) return rarch_threaded_video_get_ptr(NULL); #endif @@ -363,7 +363,7 @@ static void init_video_filter(enum retro_pixel_format colfmt) if (colfmt == RETRO_PIXEL_FORMAT_0RGB1555) colfmt = RETRO_PIXEL_FORMAT_RGB565; - if (video_driver_ctl(RARCH_DISPLAY_CTL_IS_HW_CONTEXT, NULL)) + if (video_driver_is_hw_context()) { RARCH_WARN("Cannot use CPU filters when hardware rendering is used.\n"); return; @@ -510,8 +510,8 @@ static bool uninit_video_input(void) { event_cmd_ctl(EVENT_CMD_OVERLAY_DEINIT, NULL); - if (!video_driver_ctl(RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT, NULL)) - video_driver_ctl(RARCH_DISPLAY_CTL_DEINIT_HW_CONTEXT, NULL); + if (!video_driver_is_video_cache_context()) + video_driver_deinit_hw_context(); if ( !input_driver_ctl(RARCH_INPUT_CTL_OWNS_DRIVER, NULL) && @@ -520,7 +520,7 @@ static bool uninit_video_input(void) input_driver_ctl(RARCH_INPUT_CTL_DEINIT, NULL); if ( - !video_driver_ctl(RARCH_DISPLAY_CTL_OWNS_DRIVER, NULL) + !video_driver_owns_driver() && video_driver_data && current_video && current_video->free ) @@ -537,8 +537,8 @@ static bool uninit_video_input(void) static bool init_video_pixel_converter(unsigned size) { - struct retro_hw_render_callback *hwr = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); /* If pixel format is not 0RGB1555, we don't need to do * any internal pixel conversion. */ @@ -622,9 +622,9 @@ static bool init_video(void) scale = video_driver_state.filter.scale; /* Update core-dependent aspect ratio values. */ - video_driver_ctl(RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL, NULL); - video_driver_ctl(RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE, NULL); - video_driver_ctl(RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG, NULL); + video_driver_set_viewport_square_pixel(); + video_driver_set_viewport_core(); + video_driver_set_viewport_config(); /* Update CUSTOM viewport. */ custom_vp = video_viewport_get_custom(); @@ -691,11 +691,11 @@ static bool init_video(void) tmp = input_get_ptr(); /* Need to grab the "real" video driver interface on a reinit. */ - video_driver_ctl(RARCH_DISPLAY_CTL_FIND_DRIVER, NULL); + video_driver_find_driver(); #ifdef HAVE_THREADS if (settings->video.threaded - && !video_driver_ctl(RARCH_DISPLAY_CTL_IS_HW_CONTEXT, NULL)) + && !video_driver_is_hw_context()) { /* Can't do hardware rendering with threaded driver currently. */ RARCH_LOG("Starting threaded video driver ...\n"); @@ -731,7 +731,7 @@ static bool init_video(void) custom_vp->width = width; custom_vp->height = height; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, custom_vp); + video_driver_get_viewport_info(custom_vp); } video_driver_set_rotation( @@ -856,7 +856,7 @@ void video_driver_set_filtering(unsigned index, bool smooth) void video_driver_cached_frame_set(const void *data, unsigned width, unsigned height, size_t pitch) { - video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_SET_PTR, (void*)data); + video_driver_set_cached_frame_ptr(data); video_driver_state.frame_cache.width = width; video_driver_state.frame_cache.height = height; video_driver_state.frame_cache.pitch = pitch; @@ -1114,7 +1114,7 @@ static bool video_driver_cached_frame(void) return true; } -static void video_monitor_adjust_system_rates(void) +void video_driver_monitor_adjust_system_rates(void) { float timing_skew; const struct retro_system_timing *info = NULL; @@ -1252,582 +1252,670 @@ void video_driver_menu_settings(void **list_data, void *list_info_data, #endif } -bool video_driver_ctl(enum rarch_display_ctl_state state, void *data) +/* Graphics driver requires RGBA byte order data (ABGR on little-endian) + * for 32-bit. + * This takes effect for overlay and shader cores that wants to load + * data into graphics driver. Kinda hackish to place it here, it is only + * used for GLES. + * TODO: Refactor this better. */ +static struct retro_hw_render_callback hw_render; +static bool video_driver_use_rgba = false; +static bool video_driver_data_own = false; +static bool video_driver_active = false; +static video_driver_frame_t frame_bak = NULL; +/* If set during context deinit, the driver should keep + * graphics context alive to avoid having to reset all + * context state. */ +static bool video_driver_cache_context = false; +/* Set to true by driver if context caching succeeded. */ +static bool video_driver_cache_context_ack = false; +static uint8_t *video_driver_record_gpu_buffer = NULL; +#ifdef HAVE_THREADS +static slock_t *display_lock = NULL; +#endif + +void video_driver_lock(void) { - /* Graphics driver requires RGBA byte order data (ABGR on little-endian) - * for 32-bit. - * This takes effect for overlay and shader cores that wants to load - * data into graphics driver. Kinda hackish to place it here, it is only - * used for GLES. - * TODO: Refactor this better. */ - static struct retro_hw_render_callback hw_render; - static bool video_driver_use_rgba = false; - static bool video_driver_data_own = false; - static bool video_driver_active = false; - static video_driver_frame_t frame_bak = NULL; - /* If set during context deinit, the driver should keep - * graphics context alive to avoid having to reset all - * context state. */ - static bool video_driver_cache_context = false; - /* Set to true by driver if context caching succeeded. */ - static bool video_driver_cache_context_ack = false; - static uint8_t *video_driver_record_gpu_buffer = NULL; #ifdef HAVE_THREADS - static slock_t *display_lock = NULL; + if (!display_lock) + return; + slock_lock(display_lock); #endif - settings_t *settings = config_get_ptr(); +} - switch (state) +void video_driver_unlock(void) +{ +#ifdef HAVE_THREADS + if (!display_lock) + return; + slock_unlock(display_lock); +#endif +} + +void video_driver_lock_free(void) +{ +#ifdef HAVE_THREADS + slock_free(display_lock); + display_lock = NULL; +#endif +} + +void video_driver_lock_new(void) +{ + video_driver_lock_free(); +#ifdef HAVE_THREADS + if (!display_lock) + display_lock = slock_new(); + retro_assert(display_lock); +#endif +} + +void video_driver_destroy(void) +{ + video_driver_use_rgba = false; + video_driver_data_own = false; + video_driver_active = false; + video_driver_cache_context = false; + video_driver_cache_context_ack = false; + video_driver_record_gpu_buffer = NULL; + current_video = NULL; +} + +void video_driver_set_cached_frame_ptr(const void *data) +{ + if (data) + video_driver_state.frame_cache.data = data; +} + +void video_driver_set_stub_frame(void) +{ + frame_bak = current_video->frame; + current_video->frame = video_null.frame; +} + +void video_driver_unset_stub_frame(void) +{ + if (frame_bak != NULL) + current_video->frame = frame_bak; + + frame_bak = NULL; +} + +bool video_driver_supports_recording(void) +{ + settings_t *settings = config_get_ptr(); + return settings->video.gpu_record && current_video->read_viewport; +} + +bool video_driver_supports_viewport_read(void) +{ + settings_t *settings = config_get_ptr(); + return (settings->video.gpu_screenshot || + (video_driver_is_hw_context() && !current_video->read_frame_raw)) + && current_video->read_viewport && current_video->viewport_info; +} + +bool video_driver_supports_read_frame_raw(void) +{ + return current_video->read_frame_raw; +} + +void video_driver_set_viewport_config(void) +{ + settings_t *settings = config_get_ptr(); + struct retro_system_av_info *av_info = video_viewport_get_system_av_info(); + + if (settings->video.aspect_ratio < 0.0f) { - case RARCH_DISPLAY_CTL_LOCK: -#ifdef HAVE_THREADS - if (!display_lock) - return false; - slock_lock(display_lock); -#endif - break; - case RARCH_DISPLAY_CTL_UNLOCK: -#ifdef HAVE_THREADS - if (!display_lock) - return false; - slock_unlock(display_lock); -#endif - break; - case RARCH_DISPLAY_CTL_LOCK_FREE: -#ifdef HAVE_THREADS - slock_free(display_lock); - display_lock = NULL; -#endif - break; - case RARCH_DISPLAY_CTL_LOCK_NEW: - video_driver_ctl(RARCH_DISPLAY_CTL_LOCK_FREE, NULL); -#ifdef HAVE_THREADS - if (!display_lock) - display_lock = slock_new(); - retro_assert(display_lock); -#endif - break; - case RARCH_DISPLAY_CTL_DESTROY: - video_driver_use_rgba = false; - video_driver_data_own = false; - video_driver_active = false; - video_driver_cache_context = false; - video_driver_cache_context_ack = false; - video_driver_record_gpu_buffer = NULL; - current_video = NULL; - break; - case RARCH_DISPLAY_CTL_CACHED_FRAME_SET_PTR: - if (!data) - return false; - video_driver_state.frame_cache.data = (const void*)data; - break; - case RARCH_DISPLAY_CTL_SET_STUB_FRAME: - frame_bak = current_video->frame; - current_video->frame = video_null.frame; - break; - case RARCH_DISPLAY_CTL_UNSET_STUB_FRAME: - if (frame_bak != NULL) - current_video->frame = frame_bak; - frame_bak = NULL; - break; - case RARCH_DISPLAY_CTL_SUPPORTS_RECORDING: - return settings->video.gpu_record && current_video->read_viewport; - case RARCH_DISPLAY_CTL_SUPPORTS_VIEWPORT_READ: - return (settings->video.gpu_screenshot || - (video_driver_ctl(RARCH_DISPLAY_CTL_IS_HW_CONTEXT, NULL) - && !current_video->read_frame_raw)) - && current_video->read_viewport && current_video->viewport_info; - case RARCH_DISPLAY_CTL_SUPPORTS_READ_FRAME_RAW: - return current_video->read_frame_raw; - case RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG: - { - struct retro_system_av_info *av_info = video_viewport_get_system_av_info(); + struct retro_game_geometry *geom = &av_info->geometry; - if (settings->video.aspect_ratio < 0.0f) - { - struct retro_game_geometry *geom = &av_info->geometry; + if (!geom) + return; - if (!geom) - return false; + if (geom->aspect_ratio > 0.0f && settings->video.aspect_ratio_auto) + aspectratio_lut[ASPECT_RATIO_CONFIG].value = geom->aspect_ratio; + else + { + unsigned base_width = geom->base_width; + unsigned base_height = geom->base_height; - if (geom->aspect_ratio > 0.0f && settings->video.aspect_ratio_auto) - aspectratio_lut[ASPECT_RATIO_CONFIG].value = geom->aspect_ratio; - else - { - unsigned base_width = geom->base_width; - unsigned base_height = geom->base_height; - - /* Get around division by zero errors */ - if (base_width == 0) - base_width = 1; - if (base_height == 0) - base_height = 1; - aspectratio_lut[ASPECT_RATIO_CONFIG].value = - (float)base_width / base_height; /* 1:1 PAR. */ - } - } - else - aspectratio_lut[ASPECT_RATIO_CONFIG].value = - settings->video.aspect_ratio; - } - break; - case RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL: - { - unsigned len, highest, i, aspect_x, aspect_y; - unsigned width, height; - struct retro_game_geometry *geom = NULL; - struct retro_system_av_info *av_info = - video_viewport_get_system_av_info(); - - if (av_info) - geom = &av_info->geometry; - - if (!geom) - return false; - - width = geom->base_width; - height = geom->base_height; - - if (width == 0 || height == 0) - return false; - - len = MIN(width, height); - highest = 1; - - for (i = 1; i < len; i++) - { - if ((width % i) == 0 && (height % i) == 0) - highest = i; - } - - aspect_x = width / highest; - aspect_y = height / highest; - - snprintf(aspectratio_lut[ASPECT_RATIO_SQUARE].name, - sizeof(aspectratio_lut[ASPECT_RATIO_SQUARE].name), - "%u:%u (1:1 PAR)", aspect_x, aspect_y); - - aspectratio_lut[ASPECT_RATIO_SQUARE].value = (float)aspect_x / aspect_y; - } - break; - case RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE: - { - struct retro_system_av_info *av_info = - video_viewport_get_system_av_info(); - struct retro_game_geometry *geom = &av_info->geometry; - - if (!geom || geom->base_width <= 0.0f || geom->base_height <= 0.0f) - return false; - - /* Fallback to 1:1 pixel ratio if none provided */ - if (geom->aspect_ratio > 0.0f) - aspectratio_lut[ASPECT_RATIO_CORE].value = geom->aspect_ratio; - else - aspectratio_lut[ASPECT_RATIO_CORE].value = - (float)geom->base_width / geom->base_height; - } - break; - case RARCH_DISPLAY_CTL_RESET_CUSTOM_VIEWPORT: - { - struct video_viewport *custom_vp = video_viewport_get_custom(); - if (!custom_vp) - return false; - - custom_vp->width = 0; - custom_vp->height = 0; - custom_vp->x = 0; - custom_vp->y = 0; - } - break; - case RARCH_DISPLAY_CTL_SET_RGBA: - video_driver_ctl(RARCH_DISPLAY_CTL_LOCK, NULL); - video_driver_use_rgba = true; - video_driver_ctl(RARCH_DISPLAY_CTL_UNLOCK, NULL); - break; - case RARCH_DISPLAY_CTL_UNSET_RGBA: - video_driver_ctl(RARCH_DISPLAY_CTL_LOCK, NULL); - video_driver_use_rgba = false; - video_driver_ctl(RARCH_DISPLAY_CTL_UNLOCK, NULL); - break; - case RARCH_DISPLAY_CTL_SUPPORTS_RGBA: - { - bool tmp = false; - video_driver_ctl(RARCH_DISPLAY_CTL_LOCK, NULL); - tmp = video_driver_use_rgba; - video_driver_ctl(RARCH_DISPLAY_CTL_UNLOCK, NULL); - - if (!tmp) - return false; - } - break; - case RARCH_DISPLAY_CTL_GET_NEXT_VIDEO_OUT: - if (!video_driver_poke) - return false; - - if (!video_driver_poke->get_video_output_next) - return gfx_ctx_ctl(GFX_CTL_GET_VIDEO_OUTPUT_NEXT, NULL); - video_driver_poke->get_video_output_next(video_driver_data); - break; - case RARCH_DISPLAY_CTL_GET_PREV_VIDEO_OUT: - if (!video_driver_poke) - return false; - - if (!video_driver_poke->get_video_output_prev) - return gfx_ctx_ctl(GFX_CTL_GET_VIDEO_OUTPUT_NEXT, NULL); - video_driver_poke->get_video_output_prev(video_driver_data); - break; - case RARCH_DISPLAY_CTL_INIT: - video_driver_ctl(RARCH_DISPLAY_CTL_LOCK_NEW, NULL); - return init_video(); - case RARCH_DISPLAY_CTL_DESTROY_DATA: - video_driver_data = NULL; - break; - case RARCH_DISPLAY_CTL_DEINIT: - uninit_video_input(); - video_driver_ctl(RARCH_DISPLAY_CTL_LOCK_FREE, NULL); - video_driver_data = NULL; - break; - case RARCH_DISPLAY_CTL_MONITOR_RESET: - video_driver_state.frame_time.count = 0; - break; - case RARCH_DISPLAY_CTL_MONITOR_ADJUST_SYSTEM_RATES: - video_monitor_adjust_system_rates(); - break; - case RARCH_DISPLAY_CTL_SET_ASPECT_RATIO: - if (!video_driver_poke || !video_driver_poke->set_aspect_ratio) - return false; - video_driver_poke->set_aspect_ratio( - video_driver_data, settings->video.aspect_ratio_idx); - break; - case RARCH_DISPLAY_CTL_SHOW_MOUSE: - if (!video_driver_poke) - return false; - if (video_driver_poke->show_mouse) - video_driver_poke->show_mouse(video_driver_data, true); - break; - case RARCH_DISPLAY_CTL_HIDE_MOUSE: - if (!video_driver_poke) - return false; - if (video_driver_poke->show_mouse) - video_driver_poke->show_mouse(video_driver_data, false); - break; - case RARCH_DISPLAY_CTL_SET_NONBLOCK_STATE: - { - bool *toggle = (bool*)data; - - if (!toggle) - return false; - - if (current_video->set_nonblock_state) - current_video->set_nonblock_state(video_driver_data, *toggle); - } - break; - case RARCH_DISPLAY_CTL_FIND_DRIVER: - { - int i; - driver_ctx_info_t drv; - - if (video_driver_ctl(RARCH_DISPLAY_CTL_IS_HW_CONTEXT, NULL)) - { - struct retro_hw_render_callback *hwr = NULL; - current_video = NULL; - - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); - (void)hwr; - - if (hwr && hw_render_context_is_vulkan(hwr->context_type)) - { -#if defined(HAVE_VULKAN) - RARCH_LOG("Using HW render, Vulkan driver forced.\n"); - current_video = &video_vulkan; -#endif - } - - if (hwr && hw_render_context_is_gl(hwr->context_type)) - { -#if defined(HAVE_OPENGL) && defined(HAVE_FBO) - RARCH_LOG("Using HW render, OpenGL driver forced.\n"); - current_video = &video_gl; -#endif - } - - if (current_video) - return true; - } - - if (frontend_driver_has_get_video_driver_func()) - { - current_video = (video_driver_t*)frontend_driver_get_video_driver(); - - if (current_video) - return true; - RARCH_WARN("Frontend supports get_video_driver() but did not specify one.\n"); - } - - drv.label = "video_driver"; - drv.s = settings->video.driver; - - driver_ctl(RARCH_DRIVER_CTL_FIND_INDEX, &drv); - - i = drv.len; - - if (i >= 0) - current_video = (video_driver_t*)video_driver_find_handle(i); - else - { - unsigned d; - RARCH_ERR("Couldn't find any video driver named \"%s\"\n", - settings->video.driver); - RARCH_LOG_OUTPUT("Available video drivers are:\n"); - for (d = 0; video_driver_find_handle(d); d++) - RARCH_LOG_OUTPUT("\t%s\n", video_driver_find_ident(d)); - RARCH_WARN("Going to default to first video driver...\n"); - - current_video = (video_driver_t*)video_driver_find_handle(0); - - if (!current_video) - retro_fail(1, "find_video_driver()"); - } - } - break; - case RARCH_DISPLAY_CTL_APPLY_STATE_CHANGES: - if (!video_driver_poke) - return false; - if (video_driver_poke->apply_state_changes) - video_driver_poke->apply_state_changes(video_driver_data); - break; - case RARCH_DISPLAY_CTL_READ_VIEWPORT: - if (!current_video->read_viewport) - return false; - if (!current_video->read_viewport(video_driver_data, - (uint8_t*)data)) - return false; - break; - case RARCH_DISPLAY_CTL_CACHED_FRAME_HAS_VALID_FB: - if (!video_driver_state.frame_cache.data) - return false; - return (video_driver_state.frame_cache.data - == RETRO_HW_FRAME_BUFFER_VALID); - case RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER: - if (!current_video) - return false; - return video_driver_cached_frame(); - case RARCH_DISPLAY_CTL_IS_ALIVE: - if (current_video) - return current_video->alive(video_driver_data); - break; - case RARCH_DISPLAY_CTL_IS_FOCUSED: - return current_video->focus(video_driver_data); - case RARCH_DISPLAY_CTL_HAS_WINDOWED: -#if defined(RARCH_CONSOLE) || defined(RARCH_MOBILE) - return false; -#else - if (!current_video->has_windowed(video_driver_data)) - return false; - break; -#endif - case RARCH_DISPLAY_CTL_GET_FRAME_COUNT: - { - uint64_t **ptr = (uint64_t**)data; - if (!ptr) - return false; - *ptr = &video_driver_frame_count; - } - break; - case RARCH_DISPLAY_CTL_FRAME_FILTER_ALIVE: - if (!video_driver_state.filter.filter) - return false; - break; - case RARCH_DISPLAY_CTL_FRAME_FILTER_IS_32BIT: - return video_driver_state.filter.out_rgb32; - case RARCH_DISPLAY_CTL_DEFAULT_SETTINGS: - { - global_t *global = global_get_ptr(); - - if (!global) - return false; - - global->console.screen.gamma_correction = DEFAULT_GAMMA; - global->console.flickerfilter_enable = false; - global->console.softfilter_enable = false; - - global->console.screen.resolutions.current.id = 0; - } - break; - case RARCH_DISPLAY_CTL_LOAD_SETTINGS: - { - global_t *global = global_get_ptr(); - config_file_t *conf = (config_file_t*)data; - - if (!conf) - return false; - - CONFIG_GET_BOOL_BASE(conf, global, - console.screen.gamma_correction, "gamma_correction"); - config_get_bool(conf, "flicker_filter_enable", - &global->console.flickerfilter_enable); - config_get_bool(conf, "soft_filter_enable", - &global->console.softfilter_enable); - - CONFIG_GET_INT_BASE(conf, global, - console.screen.soft_filter_index, - "soft_filter_index"); - CONFIG_GET_INT_BASE(conf, global, - console.screen.resolutions.current.id, - "current_resolution_id"); - CONFIG_GET_INT_BASE(conf, global, - console.screen.flicker_filter_index, - "flicker_filter_index"); - } - break; - case RARCH_DISPLAY_CTL_SAVE_SETTINGS: - { - global_t *global = global_get_ptr(); - config_file_t *conf = (config_file_t*)data; - - if (!conf) - return false; - - config_set_bool(conf, "gamma_correction", - global->console.screen.gamma_correction); - config_set_bool(conf, "flicker_filter_enable", - global->console.flickerfilter_enable); - config_set_bool(conf, "soft_filter_enable", - global->console.softfilter_enable); - - config_set_int(conf, "soft_filter_index", - global->console.screen.soft_filter_index); - config_set_int(conf, "current_resolution_id", - global->console.screen.resolutions.current.id); - config_set_int(conf, "flicker_filter_index", - global->console.screen.flicker_filter_index); - } - break; - case RARCH_DISPLAY_CTL_SET_OWN_DRIVER: - video_driver_data_own = true; - break; - case RARCH_DISPLAY_CTL_UNSET_OWN_DRIVER: - video_driver_data_own = false; - break; - case RARCH_DISPLAY_CTL_OWNS_DRIVER: - return video_driver_data_own; - case RARCH_DISPLAY_CTL_IS_HW_CONTEXT: - return (hw_render.context_type != RETRO_HW_CONTEXT_NONE); - case RARCH_DISPLAY_CTL_DEINIT_HW_CONTEXT: - if (hw_render.context_destroy) - hw_render.context_destroy(); - - memset(&hw_render, 0, sizeof(hw_render)); - break; - case RARCH_DISPLAY_CTL_HW_CONTEXT_GET: - { - struct retro_hw_render_callback **hw_cb = - (struct retro_hw_render_callback**)data; - if (!hw_cb) - return false; - *hw_cb = &hw_render; - } - break; - case RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT: - video_driver_cache_context = true; - break; - case RARCH_DISPLAY_CTL_UNSET_VIDEO_CACHE_CONTEXT: - video_driver_cache_context = false; - break; - case RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT: - return video_driver_cache_context; - case RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT_ACK: - video_driver_cache_context_ack = true; - break; - case RARCH_DISPLAY_CTL_UNSET_VIDEO_CACHE_CONTEXT_ACK: - video_driver_cache_context_ack = false; - break; - case RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT_ACK: - return video_driver_cache_context_ack; - case RARCH_DISPLAY_CTL_SET_ACTIVE: - video_driver_active = true; - break; - case RARCH_DISPLAY_CTL_UNSET_ACTIVE: - video_driver_active = false; - break; - case RARCH_DISPLAY_CTL_IS_ACTIVE: - return video_driver_active; - case RARCH_DISPLAY_CTL_HAS_GPU_RECORD: - return (video_driver_record_gpu_buffer != NULL); - case RARCH_DISPLAY_CTL_GPU_RECORD_GET: - { - uint8_t **new_data = (uint8_t**)data; - - if (!new_data) - return false; - *new_data = video_driver_record_gpu_buffer; - } - break; - case RARCH_DISPLAY_CTL_GPU_RECORD_INIT: - { - unsigned *new_size = (unsigned*)data; - if (!new_size) - return false; - video_driver_record_gpu_buffer = (uint8_t*)malloc(*new_size); - if (!video_driver_record_gpu_buffer) - return false; - } - break; - case RARCH_DISPLAY_CTL_GPU_RECORD_DEINIT: - if (video_driver_record_gpu_buffer) - free(video_driver_record_gpu_buffer); - video_driver_record_gpu_buffer = NULL; - break; - case RARCH_DISPLAY_CTL_GET_CURRENT_SOFTWARE_FRAMEBUFFER: - if ( - !video_driver_poke || - !video_driver_poke->get_current_software_framebuffer) - return false; - if (!video_driver_poke->get_current_software_framebuffer( - video_driver_data, (struct retro_framebuffer *)data)) - return false; - break; - case RARCH_DISPLAY_CTL_GET_HW_RENDER_INTERFACE: - if ( - !video_driver_poke || - !video_driver_poke->get_hw_render_interface) - return false; - if (!video_driver_poke->get_hw_render_interface(video_driver_data, - (const struct retro_hw_render_interface**)data)) - return false; - break; - case RARCH_DISPLAY_CTL_VIEWPORT_INFO: - if (!current_video || !current_video->viewport_info) - return false; - current_video->viewport_info(video_driver_data, (struct video_viewport*)data); - break; - case RARCH_DISPLAY_CTL_SET_TITLE_BUF: - { - struct retro_system_info info; - core_get_system_info(&info); - strlcpy(video_driver_title_buf, - msg_hash_to_str(MSG_PROGRAM), - sizeof(video_driver_title_buf)); - strlcat(video_driver_title_buf, - " ", sizeof(video_driver_title_buf)); - strlcat(video_driver_title_buf, - info.library_name, - sizeof(video_driver_title_buf)); - strlcat(video_driver_title_buf, - " ", sizeof(video_driver_title_buf)); - strlcat(video_driver_title_buf, - info.library_version, - sizeof(video_driver_title_buf)); - } - break; - case RARCH_DISPLAY_CTL_NONE: - default: - break; + /* Get around division by zero errors */ + if (base_width == 0) + base_width = 1; + if (base_height == 0) + base_height = 1; + aspectratio_lut[ASPECT_RATIO_CONFIG].value = + (float)base_width / base_height; /* 1:1 PAR. */ + } } + else + { + aspectratio_lut[ASPECT_RATIO_CONFIG].value = + settings->video.aspect_ratio; + } +} + +void video_driver_set_viewport_square_pixel(void) +{ + unsigned len, highest, i, aspect_x, aspect_y; + unsigned width, height; + struct retro_game_geometry *geom = NULL; + struct retro_system_av_info *av_info = + video_viewport_get_system_av_info(); + + if (av_info) + geom = &av_info->geometry; + + if (!geom) + return; + + width = geom->base_width; + height = geom->base_height; + + if (width == 0 || height == 0) + return; + + len = MIN(width, height); + highest = 1; + + for (i = 1; i < len; i++) + { + if ((width % i) == 0 && (height % i) == 0) + highest = i; + } + + aspect_x = width / highest; + aspect_y = height / highest; + + snprintf(aspectratio_lut[ASPECT_RATIO_SQUARE].name, + sizeof(aspectratio_lut[ASPECT_RATIO_SQUARE].name), + "%u:%u (1:1 PAR)", aspect_x, aspect_y); + + aspectratio_lut[ASPECT_RATIO_SQUARE].value = (float)aspect_x / aspect_y; +} + +void video_driver_set_viewport_core(void) +{ + struct retro_system_av_info *av_info = + video_viewport_get_system_av_info(); + struct retro_game_geometry *geom = &av_info->geometry; + + if (!geom || geom->base_width <= 0.0f || geom->base_height <= 0.0f) + return; + + /* Fallback to 1:1 pixel ratio if none provided */ + if (geom->aspect_ratio > 0.0f) + { + aspectratio_lut[ASPECT_RATIO_CORE].value = geom->aspect_ratio; + } + else + { + aspectratio_lut[ASPECT_RATIO_CORE].value = + (float)geom->base_width / geom->base_height; + } +} + +void video_driver_reset_custom_viewport(void) +{ + struct video_viewport *custom_vp = video_viewport_get_custom(); + if (!custom_vp) + return; + + custom_vp->width = 0; + custom_vp->height = 0; + custom_vp->x = 0; + custom_vp->y = 0; +} + +void video_driver_set_rgba(void) +{ + video_driver_lock(); + video_driver_use_rgba = true; + video_driver_unlock(); +} + +void video_driver_unset_rgba(void) +{ + video_driver_lock(); + video_driver_use_rgba = false; + video_driver_unlock(); +} + +bool video_driver_supports_rgba(void) +{ + bool tmp; + video_driver_lock(); + tmp = video_driver_use_rgba; + video_driver_unlock(); + return tmp; +} + +bool video_driver_get_next_video_out(void) +{ + if (!video_driver_poke) + return false; + + if (!video_driver_poke->get_video_output_next) + return gfx_ctx_ctl(GFX_CTL_GET_VIDEO_OUTPUT_NEXT, NULL); + video_driver_poke->get_video_output_next(video_driver_data); + return true; +} + +bool video_driver_get_prev_video_out(void) +{ + if (!video_driver_poke) + return false; + + if (!video_driver_poke->get_video_output_prev) + return gfx_ctx_ctl(GFX_CTL_GET_VIDEO_OUTPUT_NEXT, NULL); + video_driver_poke->get_video_output_prev(video_driver_data); + return true; +} + +bool video_driver_init(void) +{ + video_driver_lock_new(); + return init_video(); +} + +void video_driver_destroy_data(void) +{ + video_driver_data = NULL; +} + +void video_driver_deinit(void) +{ + uninit_video_input(); + video_driver_lock_free(); + video_driver_data = NULL; +} + +void video_driver_monitor_reset(void) +{ + video_driver_state.frame_time.count = 0; +} + +void video_driver_set_aspect_ratio(void) +{ + settings_t *settings = config_get_ptr(); + if (!video_driver_poke || !video_driver_poke->set_aspect_ratio) + return; + video_driver_poke->set_aspect_ratio( + video_driver_data, settings->video.aspect_ratio_idx); +} + +void video_driver_show_mouse(void) +{ + if (!video_driver_poke) + return; + if (video_driver_poke->show_mouse) + video_driver_poke->show_mouse(video_driver_data, true); +} + +void video_driver_hide_mouse(void) +{ + if (!video_driver_poke) + return; + if (video_driver_poke->show_mouse) + video_driver_poke->show_mouse(video_driver_data, false); +} + +void video_driver_set_nonblock_state(bool toggle) +{ + if (current_video->set_nonblock_state) + current_video->set_nonblock_state(video_driver_data, toggle); +} + +bool video_driver_find_driver(void) +{ + settings_t *settings = config_get_ptr(); + int i; + driver_ctx_info_t drv; + + if (video_driver_is_hw_context()) + { + current_video = NULL; + struct retro_hw_render_callback *hwr = video_driver_get_hw_context(); + + if (hwr && hw_render_context_is_vulkan(hwr->context_type)) + { +#if defined(HAVE_VULKAN) + RARCH_LOG("Using HW render, Vulkan driver forced.\n"); + current_video = &video_vulkan; +#endif + } + + if (hwr && hw_render_context_is_gl(hwr->context_type)) + { +#if defined(HAVE_OPENGL) && defined(HAVE_FBO) + RARCH_LOG("Using HW render, OpenGL driver forced.\n"); + current_video = &video_gl; +#endif + } + + if (current_video) + return true; + } + + if (frontend_driver_has_get_video_driver_func()) + { + current_video = (video_driver_t*)frontend_driver_get_video_driver(); + + if (current_video) + return true; + RARCH_WARN("Frontend supports get_video_driver() but did not specify one.\n"); + } + + drv.label = "video_driver"; + drv.s = settings->video.driver; + + driver_ctl(RARCH_DRIVER_CTL_FIND_INDEX, &drv); + + i = drv.len; + + if (i >= 0) + current_video = (video_driver_t*)video_driver_find_handle(i); + else + { + unsigned d; + RARCH_ERR("Couldn't find any video driver named \"%s\"\n", + settings->video.driver); + RARCH_LOG_OUTPUT("Available video drivers are:\n"); + for (d = 0; video_driver_find_handle(d); d++) + RARCH_LOG_OUTPUT("\t%s\n", video_driver_find_ident(d)); + RARCH_WARN("Going to default to first video driver...\n"); + + current_video = (video_driver_t*)video_driver_find_handle(0); + + if (!current_video) + retro_fail(1, "find_video_driver()"); + } + return true; +} + +void video_driver_apply_state_changes(void) +{ + if (!video_driver_poke) + return; + if (video_driver_poke->apply_state_changes) + video_driver_poke->apply_state_changes(video_driver_data); +} + +bool video_driver_read_viewport(uint8_t *buffer) +{ + if (!current_video->read_viewport) + return false; + if (!current_video->read_viewport(video_driver_data, buffer)) + return false; return true; } +bool video_driver_cached_frame_has_valid_framebuffer(void) +{ + if (!video_driver_state.frame_cache.data) + return false; + return video_driver_state.frame_cache.data == RETRO_HW_FRAME_BUFFER_VALID; +} + +bool video_driver_cached_frame_render(void) +{ + if (!current_video) + return false; + return video_driver_cached_frame(); +} + +bool video_driver_is_alive(void) +{ + if (current_video) + return current_video->alive(video_driver_data); + else + return true; +} + +bool video_driver_is_focused(void) +{ + return current_video->focus(video_driver_data); +} + +bool video_driver_has_windowed(void) +{ +#if defined(RARCH_CONSOLE) || defined(RARCH_MOBILE) + return false; +#else + return current_video->has_windowed(video_driver_data); +#endif +} + +uint64_t *video_driver_get_frame_count_ptr(void) +{ + return &video_driver_frame_count; +} + +bool video_driver_frame_filter_alive(void) +{ + return !!video_driver_state.filter.filter; +} + +bool video_driver_frame_filter_is_32bit(void) +{ + return video_driver_state.filter.out_rgb32; +} + +void video_driver_default_settings(void) +{ + global_t *global = global_get_ptr(); + + if (!global) + return; + + global->console.screen.gamma_correction = DEFAULT_GAMMA; + global->console.flickerfilter_enable = false; + global->console.softfilter_enable = false; + + global->console.screen.resolutions.current.id = 0; +} + +void video_driver_load_settings(config_file_t *conf) +{ + global_t *global = global_get_ptr(); + + if (!conf) + return; + + CONFIG_GET_BOOL_BASE(conf, global, + console.screen.gamma_correction, "gamma_correction"); + config_get_bool(conf, "flicker_filter_enable", + &global->console.flickerfilter_enable); + config_get_bool(conf, "soft_filter_enable", + &global->console.softfilter_enable); + + CONFIG_GET_INT_BASE(conf, global, + console.screen.soft_filter_index, + "soft_filter_index"); + CONFIG_GET_INT_BASE(conf, global, + console.screen.resolutions.current.id, + "current_resolution_id"); + CONFIG_GET_INT_BASE(conf, global, + console.screen.flicker_filter_index, + "flicker_filter_index"); +} + +void video_driver_save_settings(config_file_t *conf) +{ + global_t *global = global_get_ptr(); + if (!conf) + return; + + config_set_bool(conf, "gamma_correction", + global->console.screen.gamma_correction); + config_set_bool(conf, "flicker_filter_enable", + global->console.flickerfilter_enable); + config_set_bool(conf, "soft_filter_enable", + global->console.softfilter_enable); + + config_set_int(conf, "soft_filter_index", + global->console.screen.soft_filter_index); + config_set_int(conf, "current_resolution_id", + global->console.screen.resolutions.current.id); + config_set_int(conf, "flicker_filter_index", + global->console.screen.flicker_filter_index); +} + +void video_driver_set_own_driver(void) +{ + video_driver_data_own = true; +} + +void video_driver_unset_own_driver(void) +{ + video_driver_data_own = false; +} + +bool video_driver_owns_driver(void) +{ + return video_driver_data_own; +} + +bool video_driver_is_hw_context(void) +{ + return hw_render.context_type != RETRO_HW_CONTEXT_NONE; +} + +void video_driver_deinit_hw_context(void) +{ + if (hw_render.context_destroy) + hw_render.context_destroy(); + + memset(&hw_render, 0, sizeof(hw_render)); +} + +struct retro_hw_render_callback *video_driver_get_hw_context(void) +{ + return &hw_render; +} + +void video_driver_set_video_cache_context(void) +{ + video_driver_cache_context = true; +} + +void video_driver_unset_video_cache_context(void) +{ + video_driver_cache_context = false; +} + +bool video_driver_is_video_cache_context(void) +{ + return video_driver_cache_context; +} + +void video_driver_set_video_cache_context_ack(void) +{ + video_driver_cache_context_ack = true; +} + +void video_driver_unset_video_cache_context_ack(void) +{ + video_driver_cache_context_ack = false; +} + +bool video_driver_is_video_cache_context_ack(void) +{ + return video_driver_cache_context_ack; +} + +void video_driver_set_active(void) +{ + video_driver_active = true; +} + +void video_driver_unset_active(void) +{ + video_driver_active = false; +} + +bool video_driver_is_active(void) +{ + return video_driver_active; +} + +bool video_driver_has_gpu_record(void) +{ + return video_driver_record_gpu_buffer != NULL; +} + +uint8_t *video_driver_get_gpu_record(void) +{ + return video_driver_record_gpu_buffer; +} + +bool video_driver_gpu_record_init(unsigned size) +{ + video_driver_record_gpu_buffer = (uint8_t*)malloc(size); + if (!video_driver_record_gpu_buffer) + return false; + return true; +} + +void video_driver_gpu_record_deinit(void) +{ + free(video_driver_record_gpu_buffer); + video_driver_record_gpu_buffer = NULL; +} + +bool video_driver_get_current_software_framebuffer(struct retro_framebuffer *fb) +{ + if ( + !video_driver_poke || + !video_driver_poke->get_current_software_framebuffer) + return false; + if (!video_driver_poke->get_current_software_framebuffer( + video_driver_data, fb)) + return false; + + return true; +} + +bool video_driver_get_hw_render_interface(const struct retro_hw_render_interface **iface) +{ + if ( + !video_driver_poke || + !video_driver_poke->get_hw_render_interface) + return false; + + if (!video_driver_poke->get_hw_render_interface(video_driver_data, iface)) + return false; + + return true; +} + +bool video_driver_get_viewport_info(struct video_viewport *viewport) +{ + if (!current_video || !current_video->viewport_info) + return false; + current_video->viewport_info(video_driver_data, viewport); + return true; +} + +void video_driver_set_title_buf(void) +{ + struct retro_system_info info; + core_get_system_info(&info); + strlcpy(video_driver_title_buf, + msg_hash_to_str(MSG_PROGRAM), + sizeof(video_driver_title_buf)); + strlcat(video_driver_title_buf, + " ", sizeof(video_driver_title_buf)); + strlcat(video_driver_title_buf, + info.library_name, + sizeof(video_driver_title_buf)); + strlcat(video_driver_title_buf, + " ", sizeof(video_driver_title_buf)); + strlcat(video_driver_title_buf, + info.library_version, + sizeof(video_driver_title_buf)); +} /** * video_viewport_get_scaled_integer: @@ -1991,7 +2079,7 @@ void video_driver_frame(const void *data, unsigned width, runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_PULL, &msg); - if (!video_driver_ctl(RARCH_DISPLAY_CTL_IS_ACTIVE, NULL)) + if (!video_driver_is_active()) return; if (video_driver_scaler_ptr && @@ -2012,7 +2100,7 @@ void video_driver_frame(const void *data, unsigned width, !video_driver_state.filter.filter || !settings->video.post_filter_record || !data - || video_driver_ctl(RARCH_DISPLAY_CTL_HAS_GPU_RECORD, NULL) + || video_driver_has_gpu_record() ) ) recording_dump_frame(data, width, height, pitch); @@ -2034,7 +2122,9 @@ void video_driver_frame(const void *data, unsigned width, video_driver_data, data, width, height, video_driver_frame_count, pitch, video_driver_msg)) - video_driver_ctl(RARCH_DISPLAY_CTL_UNSET_ACTIVE, NULL); + { + video_driver_unset_active(); + } video_driver_frame_count++; } @@ -2083,7 +2173,7 @@ bool video_driver_texture_load(void *data, *id = video_driver_poke->load_texture(video_driver_data, data, #ifdef HAVE_THREADS settings->video.threaded - && !video_driver_ctl(RARCH_DISPLAY_CTL_IS_HW_CONTEXT, NULL), + && !video_driver_is_hw_context(), #else false, #endif diff --git a/gfx/video_driver.h b/gfx/video_driver.h index f20482ed76..450f3b2782 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -92,81 +92,6 @@ enum rarch_display_type RARCH_DISPLAY_OSX }; -enum rarch_display_ctl_state -{ - RARCH_DISPLAY_CTL_NONE = 0, - RARCH_DISPLAY_CTL_INIT, - RARCH_DISPLAY_CTL_DEINIT, - RARCH_DISPLAY_CTL_DESTROY, - RARCH_DISPLAY_CTL_DESTROY_DATA, - RARCH_DISPLAY_CTL_LOCK, - RARCH_DISPLAY_CTL_UNLOCK, - RARCH_DISPLAY_CTL_LOCK_FREE, - RARCH_DISPLAY_CTL_LOCK_NEW, - RARCH_DISPLAY_CTL_SUPPORTS_RGBA, - RARCH_DISPLAY_CTL_SET_RGBA, - RARCH_DISPLAY_CTL_UNSET_RGBA, - RARCH_DISPLAY_CTL_DEFAULT_SETTINGS, - RARCH_DISPLAY_CTL_LOAD_SETTINGS, - RARCH_DISPLAY_CTL_SAVE_SETTINGS, - RARCH_DISPLAY_CTL_MONITOR_RESET, - RARCH_DISPLAY_CTL_MONITOR_ADJUST_SYSTEM_RATES, - RARCH_DISPLAY_CTL_APPLY_STATE_CHANGES, - RARCH_DISPLAY_CTL_FIND_DRIVER, - RARCH_DISPLAY_CTL_FRAME_FILTER_ALIVE, - RARCH_DISPLAY_CTL_FRAME_FILTER_IS_32BIT, - RARCH_DISPLAY_CTL_GET_PREV_VIDEO_OUT, - RARCH_DISPLAY_CTL_GET_NEXT_VIDEO_OUT, - RARCH_DISPLAY_CTL_HAS_WINDOWED, - RARCH_DISPLAY_CTL_SUPPORTS_RECORDING, - RARCH_DISPLAY_CTL_SUPPORTS_VIEWPORT_READ, - RARCH_DISPLAY_CTL_SUPPORTS_READ_FRAME_RAW, - RARCH_DISPLAY_CTL_IS_FOCUSED, - RARCH_DISPLAY_CTL_IS_ALIVE, - RARCH_DISPLAY_CTL_SET_ASPECT_RATIO, - /* Sets viewport to aspect ratio set by core. */ - RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE, - /* Sets viewport to config aspect ratio. */ - RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG, - /* Sets viewport to square pixel aspect ratio based on width/height. */ - RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL, - RARCH_DISPLAY_CTL_RESET_CUSTOM_VIEWPORT, - RARCH_DISPLAY_CTL_READ_VIEWPORT, - RARCH_DISPLAY_CTL_SET_NONBLOCK_STATE, - RARCH_DISPLAY_CTL_SET_STUB_FRAME, - RARCH_DISPLAY_CTL_UNSET_STUB_FRAME, - /* Renders the current video frame. */ - RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, - RARCH_DISPLAY_CTL_CACHED_FRAME_HAS_VALID_FB, - RARCH_DISPLAY_CTL_CACHED_FRAME_SET_PTR, - RARCH_DISPLAY_CTL_SHOW_MOUSE, - RARCH_DISPLAY_CTL_HIDE_MOUSE, - RARCH_DISPLAY_CTL_GET_FRAME_COUNT, - RARCH_DISPLAY_CTL_SET_OWN_DRIVER, - RARCH_DISPLAY_CTL_UNSET_OWN_DRIVER, - RARCH_DISPLAY_CTL_OWNS_DRIVER, - RARCH_DISPLAY_CTL_DEINIT_HW_CONTEXT, - RARCH_DISPLAY_CTL_IS_HW_CONTEXT, - RARCH_DISPLAY_CTL_HW_CONTEXT_GET, - RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT, - RARCH_DISPLAY_CTL_UNSET_VIDEO_CACHE_CONTEXT, - RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT, - RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT_ACK, - RARCH_DISPLAY_CTL_UNSET_VIDEO_CACHE_CONTEXT_ACK, - RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT_ACK, - RARCH_DISPLAY_CTL_SET_ACTIVE, - RARCH_DISPLAY_CTL_UNSET_ACTIVE, - RARCH_DISPLAY_CTL_IS_ACTIVE, - RARCH_DISPLAY_CTL_HAS_GPU_RECORD, - RARCH_DISPLAY_CTL_GPU_RECORD_GET, - RARCH_DISPLAY_CTL_GPU_RECORD_INIT, - RARCH_DISPLAY_CTL_GPU_RECORD_DEINIT, - RARCH_DISPLAY_CTL_GET_CURRENT_SOFTWARE_FRAMEBUFFER, - RARCH_DISPLAY_CTL_GET_HW_RENDER_INTERFACE, - RARCH_DISPLAY_CTL_VIEWPORT_INFO, - RARCH_DISPLAY_CTL_SET_TITLE_BUF -}; - typedef struct video_info { unsigned width; @@ -341,7 +266,72 @@ struct aspect_ratio_elem extern struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END]; -bool video_driver_ctl(enum rarch_display_ctl_state state, void *data); +void video_driver_lock(void); +void video_driver_unlock(void); +void video_driver_lock_free(void); +void video_driver_lock_new(void); +void video_driver_destroy(void); +void video_driver_set_cached_frame_ptr(const void *data); +void video_driver_set_stub_frame(void); +void video_driver_unset_stub_frame(void); +bool video_driver_supports_recording(void); +bool video_driver_supports_viewport_read(void); +bool video_driver_supports_read_frame_raw(void); +void video_driver_set_viewport_config(void); +void video_driver_set_viewport_square_pixel(void); +void video_driver_set_viewport_core(void); +void video_driver_reset_custom_viewport(void); +void video_driver_set_rgba(void); +void video_driver_unset_rgba(void); +bool video_driver_supports_rgba(void); +bool video_driver_get_next_video_out(void); +bool video_driver_get_prev_video_out(void); +bool video_driver_init(void); +void video_driver_destroy_data(void); +void video_driver_deinit(void); +void video_driver_monitor_reset(void); +void video_driver_set_aspect_ratio(void); +void video_driver_show_mouse(void); +void video_driver_hide_mouse(void); +void video_driver_set_nonblock_state(bool toggle); +bool video_driver_find_driver(void); +void video_driver_apply_state_changes(void); +bool video_driver_read_viewport(uint8_t *buffer); +bool video_driver_cached_frame_has_valid_framebuffer(void); +bool video_driver_cached_frame_render(void); +bool video_driver_is_alive(void); +bool video_driver_is_focused(void); +bool video_driver_has_windowed(void); +uint64_t *video_driver_get_frame_count_ptr(void); +bool video_driver_frame_filter_alive(void); +bool video_driver_frame_filter_is_32bit(void); +void video_driver_default_settings(void); +void video_driver_load_settings(config_file_t *conf); +void video_driver_save_settings(config_file_t *conf); +void video_driver_set_own_driver(void); +void video_driver_unset_own_driver(void); +bool video_driver_owns_driver(void); +bool video_driver_is_hw_context(void); +void video_driver_deinit_hw_context(void); +struct retro_hw_render_callback *video_driver_get_hw_context(void); +void video_driver_set_video_cache_context(void); +void video_driver_unset_video_cache_context(void); +bool video_driver_is_video_cache_context(void); +void video_driver_set_video_cache_context_ack(void); +void video_driver_unset_video_cache_context_ack(void); +bool video_driver_is_video_cache_context_ack(void); +void video_driver_set_active(void); +void video_driver_unset_active(void); +bool video_driver_is_active(void); +bool video_driver_has_gpu_record(void); +uint8_t *video_driver_get_gpu_record(void); +bool video_driver_gpu_record_init(unsigned size); +void video_driver_gpu_record_deinit(void); +bool video_driver_get_current_software_framebuffer(struct retro_framebuffer *fb); +bool video_driver_get_hw_render_interface(const struct retro_hw_render_interface **iface); +bool video_driver_get_viewport_info(struct video_viewport *viewport); +void video_driver_set_title_buf(void); +void video_driver_monitor_adjust_system_rates(void); /** * video_driver_find_handle: diff --git a/gfx/video_texture_image.c b/gfx/video_texture_image.c index 012b388c31..966ac7812d 100644 --- a/gfx/video_texture_image.c +++ b/gfx/video_texture_image.c @@ -51,8 +51,7 @@ bool video_texture_image_set_color_shifts( *g_shift = 8; *b_shift = 0; - if (video_driver_ctl( - RARCH_DISPLAY_CTL_SUPPORTS_RGBA, NULL)) + if (video_driver_supports_rgba()) { *r_shift = 0; *b_shift = 16; diff --git a/input/drivers/x11_input.c b/input/drivers/x11_input.c index 1354788c24..d9402e5e15 100644 --- a/input/drivers/x11_input.c +++ b/input/drivers/x11_input.c @@ -312,12 +312,12 @@ static void x_input_poll_mouse(x11_input_t *x11) x11->mouse_r = mask & Button3Mask; /* Somewhat hacky, but seem to do the job. */ - if (x11->grab_mouse && video_driver_ctl(RARCH_DISPLAY_CTL_IS_FOCUSED, NULL)) + if (x11->grab_mouse && video_driver_is_focused()) { int mid_w, mid_h; struct video_viewport vp = {0}; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); mid_w = vp.full_width >> 1; mid_h = vp.full_height >> 1; @@ -338,7 +338,7 @@ static void x_input_poll(void *data) { x11_input_t *x11 = (x11_input_t*)data; - if (video_driver_ctl(RARCH_DISPLAY_CTL_IS_FOCUSED, NULL)) + if (video_driver_is_focused()) XQueryKeymap(x11->display, x11->state); else memset(x11->state, 0, sizeof(x11->state)); diff --git a/input/input_driver.c b/input/input_driver.c index fdb93abf1f..7c2bd548ae 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -379,7 +379,7 @@ bool input_translate_coord_viewport(int mouse_x, int mouse_y, int scaled_screen_x, scaled_screen_y, scaled_x, scaled_y; struct video_viewport vp = {0}; - if (!video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp)) + if (!video_driver_get_viewport_info(&vp)) return false; scaled_screen_x = (2 * mouse_x * 0x7fff) / (int)vp.full_width - 0x7fff; diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 1f0c044087..ab23bbe1bc 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -299,8 +299,7 @@ static int action_left_shader_num_passes(unsigned type, const char *label, static int action_left_video_resolution(unsigned type, const char *label, bool wraparound) { - video_driver_ctl(RARCH_DISPLAY_CTL_GET_PREV_VIDEO_OUT, NULL); - + video_driver_get_prev_video_out(); return 0; } diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 85e4c4ac4c..47b865482b 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -322,8 +322,7 @@ static int action_right_shader_num_passes(unsigned type, const char *label, static int action_right_video_resolution(unsigned type, const char *label, bool wraparound) { - video_driver_ctl(RARCH_DISPLAY_CTL_GET_NEXT_VIDEO_OUT, NULL); - + video_driver_get_next_video_out(); return 0; } diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 875d7c8e44..3d27c90ab0 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -618,7 +618,7 @@ static void mui_render_menu_list(mui_handle_t *mui, uint64_t *frame_count; size_t i = 0; size_t end = menu_entries_get_end(); - video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); + frame_count = video_driver_get_frame_count_ptr(); if (!menu_display_get_update_pending()) return; @@ -788,8 +788,7 @@ static void mui_frame(void *data) const uint32_t passivetab_color = 0x9e9e9eff; bool background_rendered = false; bool libretro_running = menu_display_libretro_running(); - - video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); + frame_count = video_driver_get_frame_count_ptr(); (void)passivetab_color; (void)activetab_color; diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 5717e5b101..9f64a98404 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -422,7 +422,7 @@ static void rgui_render(void *data) settings_t *settings = config_get_ptr(); rgui_t *rgui = (rgui_t*)data; - video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); + frame_count = video_driver_get_frame_count_ptr(); msg[0] = '\0'; title[0] = '\0'; @@ -658,7 +658,7 @@ static void rgui_render(void *data) if (settings->menu.mouse.enable && (settings->video.fullscreen - || !video_driver_ctl(RARCH_DISPLAY_CTL_HAS_WINDOWED, NULL)) + || !video_driver_has_windowed()) ) rgui_blit_cursor(); } diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index fa08b94616..51f80e8b15 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1640,8 +1640,7 @@ static void xmb_draw_items(xmb_handle_t *xmb, uint64_t *frame_count = NULL; xmb_node_t *core_node = NULL; size_t end = 0; - - video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); + frame_count = video_driver_get_frame_count_ptr(); if (!list || !list->size) return; diff --git a/menu/drivers/zarch.c b/menu/drivers/zarch.c index 64dde48889..6ed851130c 100644 --- a/menu/drivers/zarch.c +++ b/menu/drivers/zarch.c @@ -348,8 +348,7 @@ static bool zarch_zui_list_item(zui_t *zui, struct zui_tabbed *tab, int x1, int int y2 = y1 + 50; bool active = zarch_zui_check_button_up(zui, id, x1, y1, x2, y2); const float *bg = zui_bg_panel; - - video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); + frame_count = video_driver_get_frame_count_ptr(); if (tab->active_id != tab->prev_id) { diff --git a/menu/menu_display.c b/menu/menu_display.c index 3e453aa05e..f0db55c910 100644 --- a/menu/menu_display.c +++ b/menu/menu_display.c @@ -286,7 +286,7 @@ bool menu_display_libretro(void) return true; } - return video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); + return video_driver_cached_frame_render(); } void menu_display_set_width(unsigned width) @@ -577,7 +577,7 @@ void menu_display_draw_cursor( struct gfx_coords coords; settings_t *settings = config_get_ptr(); bool cursor_visible = settings->video.fullscreen || - !video_driver_ctl(RARCH_DISPLAY_CTL_HAS_WINDOWED, NULL); + !video_driver_has_windowed(); if (!settings->menu.mouse.enable) return; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 0bc85544f4..87d8502097 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -584,7 +584,7 @@ static int setting_uint_action_left_custom_viewport_width(void *data, bool wrapa if (!settings || !av_info) return -1; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); if (custom->width <= 1) custom->width = 1; @@ -611,7 +611,7 @@ static int setting_uint_action_right_custom_viewport_width(void *data, bool wrap if (!settings || !av_info) return -1; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); if (settings->video.scale_integer) custom->width += geom->base_width; @@ -636,7 +636,7 @@ static int setting_uint_action_left_custom_viewport_height(void *data, bool wrap if (!settings || !av_info) return -1; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); if (custom->height <= 1) custom->height = 1; @@ -663,7 +663,7 @@ static int setting_uint_action_right_custom_viewport_height(void *data, bool wra if (!settings || !av_info) return -1; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); if (settings->video.scale_integer) custom->height += geom->base_height; @@ -2224,7 +2224,7 @@ static int setting_action_start_custom_viewport_width(void *data) if (!settings || !av_info) return -1; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); if (settings->video.scale_integer) custom->width = ((custom->width + geom->base_width - 1) / @@ -2250,7 +2250,7 @@ static int setting_action_start_custom_viewport_height(void *data) if (!settings || !av_info) return -1; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); if (settings->video.scale_integer) custom->height = ((custom->height + geom->base_height - 1) / @@ -2335,8 +2335,7 @@ static int setting_action_start_libretro_device_type(void *data) static int setting_action_start_video_refresh_rate_auto( void *data) { - video_driver_ctl(RARCH_DISPLAY_CTL_MONITOR_RESET, NULL); - + video_driver_monitor_reset(); return 0; } @@ -2925,7 +2924,7 @@ void general_write_handler(void *data) struct retro_game_geometry *geom = (struct retro_game_geometry*) &av_info->geometry; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); if (*setting->value.target.boolean) { @@ -4297,7 +4296,7 @@ static bool setting_append_list( &setting_get_string_representation_uint_video_monitor_index; settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); - if (video_driver_ctl(RARCH_DISPLAY_CTL_HAS_WINDOWED, NULL)) + if (video_driver_has_windowed()) { CONFIG_BOOL( list, list_info, @@ -4315,7 +4314,7 @@ static bool setting_append_list( menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_REINIT); settings_data_list_current_add_flags(list, list_info, SD_FLAG_CMD_APPLY_AUTO); } - if (video_driver_ctl(RARCH_DISPLAY_CTL_HAS_WINDOWED, NULL)) + if (video_driver_has_windowed()) { CONFIG_BOOL( list, list_info, @@ -4489,7 +4488,7 @@ static bool setting_append_list( END_SUB_GROUP(list, list_info, parent_group); START_SUB_GROUP(list, list_info, "Scaling", &group_info, &subgroup_info, parent_group); - if (video_driver_ctl(RARCH_DISPLAY_CTL_HAS_WINDOWED, NULL)) + if (video_driver_has_windowed()) { CONFIG_FLOAT( list, list_info, diff --git a/record/record_driver.c b/record/record_driver.c index fd8c14b5df..d5e0bb71ad 100644 --- a/record/record_driver.c +++ b/record/record_driver.c @@ -187,12 +187,12 @@ void recording_dump_frame(const void *data, unsigned width, ffemu_data.height = height; ffemu_data.data = data; - if (video_driver_ctl(RARCH_DISPLAY_CTL_HAS_GPU_RECORD, NULL)) + if (video_driver_has_gpu_record()) { uint8_t *gpu_buf = NULL; struct video_viewport vp = {0}; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); if (!vp.width || !vp.height) { @@ -217,14 +217,15 @@ void recording_dump_frame(const void *data, unsigned width, return; } - if (!video_driver_ctl(RARCH_DISPLAY_CTL_GPU_RECORD_GET, &gpu_buf)) + gpu_buf = video_driver_get_gpu_record(); + if (!gpu_buf) return; /* Big bottleneck. * Since we might need to do read-backs asynchronously, * it might take 3-4 times before this returns true. */ - if (!video_driver_ctl(RARCH_DISPLAY_CTL_READ_VIEWPORT, gpu_buf)) - return; + if (!video_driver_read_viewport(gpu_buf)) + return; ffemu_data.pitch = global->record.gpu_width * 3; ffemu_data.width = global->record.gpu_width; @@ -234,7 +235,7 @@ void recording_dump_frame(const void *data, unsigned width, ffemu_data.pitch = -ffemu_data.pitch; } - if (!video_driver_ctl(RARCH_DISPLAY_CTL_HAS_GPU_RECORD, NULL)) + if (!video_driver_has_gpu_record()) ffemu_data.is_dupe = !data; if (recording_driver && recording_driver->push_video) @@ -311,7 +312,7 @@ bool recording_init(void) } if (!settings->video.gpu_record - && video_driver_ctl(RARCH_DISPLAY_CTL_IS_HW_CONTEXT, NULL)) + && video_driver_is_hw_context()) { RARCH_WARN("%s.\n", msg_hash_to_str(MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING)); @@ -345,12 +346,12 @@ bool recording_init(void) if (*global->record.config) params.config = global->record.config; - if (video_driver_ctl(RARCH_DISPLAY_CTL_SUPPORTS_RECORDING, NULL)) + if (video_driver_supports_recording()) { unsigned gpu_size; struct video_viewport vp = {0}; - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); if (!vp.width || !vp.height) { @@ -378,7 +379,7 @@ bool recording_init(void) vp.width, vp.height); gpu_size = vp.width * vp.height * 3; - if (!video_driver_ctl(RARCH_DISPLAY_CTL_GPU_RECORD_INIT, &gpu_size)) + if (!video_driver_gpu_record_init(gpu_size)) return false; } else @@ -396,14 +397,14 @@ bool recording_init(void) params.aspect_ratio = (float)params.out_width / params.out_height; if (settings->video.post_filter_record - && video_driver_ctl(RARCH_DISPLAY_CTL_FRAME_FILTER_ALIVE, NULL)) + && video_driver_frame_filter_alive()) { unsigned max_width = 0; unsigned max_height = 0; params.pix_fmt = FFEMU_PIX_RGB565; - if (video_driver_ctl(RARCH_DISPLAY_CTL_FRAME_FILTER_IS_32BIT, NULL)) + if (video_driver_frame_filter_is_32bit()) params.pix_fmt = FFEMU_PIX_ARGB8888; rarch_softfilter_get_max_output_size( diff --git a/retroarch.c b/retroarch.c index f577120dad..f5147d910d 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1157,7 +1157,7 @@ static void rarch_init_savefile_paths(void) static bool init_state(void) { - video_driver_ctl(RARCH_DISPLAY_CTL_SET_ACTIVE, NULL); + video_driver_set_active(); audio_driver_ctl(RARCH_AUDIO_CTL_SET_ACTIVE, NULL); rarch_ctl(RARCH_CTL_UNSET_FORCE_FULLSCREEN, NULL); diff --git a/runloop.c b/runloop.c index 9c71752fd4..72d1f9e4ae 100644 --- a/runloop.c +++ b/runloop.c @@ -222,7 +222,7 @@ static bool runloop_check_slowmotion(bool *ptr) return false; if (settings->video.black_frame_insertion) - video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); + video_driver_cached_frame_render(); if (state_manager_frame_is_reversed()) runloop_msg_queue_push(msg_hash_to_str(MSG_SLOW_MOTION_REWIND), 0, 30, true); @@ -612,7 +612,7 @@ static bool runloop_check_pause_state(event_cmd_state_t *cmd) if (runloop_cmd_triggered(cmd, RARCH_FULLSCREEN_TOGGLE_KEY)) { event_cmd_ctl(EVENT_CMD_FULLSCREEN_TOGGLE, NULL); - video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); + video_driver_cached_frame_render(); } if (!check_is_oneshot) @@ -630,14 +630,14 @@ static bool runloop_is_focused(void) { settings_t *settings = config_get_ptr(); if (settings->pause_nonactive) - return video_driver_ctl(RARCH_DISPLAY_CTL_IS_FOCUSED, NULL); + return video_driver_is_focused(); return true; } static bool runloop_is_frame_count_end(void) { - uint64_t *frame_count = NULL; - video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); + uint64_t *frame_count = + video_driver_get_frame_count_ptr(); return runloop_max_frames && (*frame_count >= runloop_max_frames); } @@ -660,7 +660,7 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data) if (!runloop_system.info.library_version) runloop_system.info.library_version = "v0"; - video_driver_ctl(RARCH_DISPLAY_CTL_SET_TITLE_BUF, NULL); + video_driver_set_title_buf(); strlcpy(runloop_system.valid_extensions, runloop_system.info.valid_extensions ? @@ -1257,7 +1257,7 @@ static INLINE int runloop_iterate_time_to_exit(bool quit_key_pressed) settings_t *settings = NULL; bool time_to_exit = runloop_ctl(RUNLOOP_CTL_IS_SHUTDOWN, NULL); time_to_exit = time_to_exit || quit_key_pressed; - time_to_exit = time_to_exit || !video_driver_ctl(RARCH_DISPLAY_CTL_IS_ALIVE, NULL); + time_to_exit = time_to_exit || !video_driver_is_alive(); time_to_exit = time_to_exit || bsv_movie_ctl(BSV_MOVIE_CTL_END_EOF, NULL); time_to_exit = time_to_exit || runloop_is_frame_count_end(); time_to_exit = time_to_exit || runloop_ctl(RUNLOOP_CTL_IS_EXEC, NULL); diff --git a/screenshot.c b/screenshot.c index bff7a629b5..70d196d0f5 100644 --- a/screenshot.c +++ b/screenshot.c @@ -144,7 +144,7 @@ static bool take_screenshot_viewport(void) settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); - video_driver_ctl(RARCH_DISPLAY_CTL_VIEWPORT_INFO, &vp); + video_driver_get_viewport_info(&vp); if (!vp.width || !vp.height) return false; @@ -152,7 +152,7 @@ static bool take_screenshot_viewport(void) if (!(buffer = (uint8_t*)malloc(vp.width * vp.height * 3))) return false; - if (!video_driver_ctl(RARCH_DISPLAY_CTL_READ_VIEWPORT, buffer)) + if (!video_driver_read_viewport(buffer)) goto done; screenshot_dir = settings->directory.screenshot; @@ -213,18 +213,18 @@ static bool take_screenshot_choice(void) if ((!*settings->directory.screenshot) && (!*global->name.base)) return false; - if (video_driver_ctl(RARCH_DISPLAY_CTL_SUPPORTS_VIEWPORT_READ, NULL)) + if (video_driver_supports_viewport_read()) { /* Avoid taking screenshot of GUI overlays. */ video_driver_set_texture_enable(false, false); - video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); + video_driver_cached_frame_render(); return take_screenshot_viewport(); } - if (!video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_HAS_VALID_FB, NULL)) + if (!video_driver_cached_frame_has_valid_framebuffer()) return take_screenshot_raw(); - if (video_driver_ctl(RARCH_DISPLAY_CTL_SUPPORTS_READ_FRAME_RAW, NULL)) + if (video_driver_supports_read_frame_raw()) { unsigned old_width, old_height; size_t old_pitch; @@ -243,7 +243,7 @@ static bool take_screenshot_choice(void) if (frame_data) { - video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_SET_PTR, (void*)frame_data); + video_driver_set_cached_frame_ptr(frame_data); if (take_screenshot_raw()) ret = true; free(frame_data); @@ -274,7 +274,7 @@ bool take_screenshot(void) runloop_msg_queue_push(msg, 1, is_paused ? 1 : 180, true); if (is_paused) - video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); + video_driver_cached_frame_render(); return ret; } From 66c4f608e6a988fbf014cc1624691c3b872901fc Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sun, 8 May 2016 14:10:28 +0200 Subject: [PATCH 7/8] Clear out rest of video_driver_ctl use. --- configuration.c | 2 +- gfx/d3d/d3d.cpp | 16 ++++++---------- gfx/d3d/render_chain_xdk.cpp | 2 +- gfx/drivers/ctr_gfx.c | 10 +++------- gfx/drivers/exynos_gfx.c | 10 +++------- gfx/drivers/gl.c | 4 ++-- gfx/drivers/gx_gfx.c | 10 +++------- gfx/drivers/psp1_gfx.c | 10 +++------- gfx/drivers/sdl2_gfx.c | 12 ++++-------- gfx/drivers/vita2d_gfx.c | 10 +++------- gfx/drivers_context/sdl_gl_ctx.c | 2 +- gfx/drivers_context/wgl_ctx.cpp | 6 +++--- input/drivers/android_input.c | 4 ++-- menu/drivers/xui.cpp | 2 +- 14 files changed, 36 insertions(+), 64 deletions(-) diff --git a/configuration.c b/configuration.c index 219cd5138b..2adf63d908 100644 --- a/configuration.c +++ b/configuration.c @@ -1406,7 +1406,7 @@ static bool config_load_file(const char *path, bool set_defaults) * important that it works for consoles right now */ config_get_bool(conf, "custom_bgm_enable", &global->console.sound.system_bgm_enable); - video_driver_ctl(RARCH_DISPLAY_CTL_LOAD_SETTINGS, conf); + video_driver_load_settings(conf); #endif CONFIG_GET_INT_BASE(conf, settings, state_slot, "state_slot"); diff --git a/gfx/d3d/d3d.cpp b/gfx/d3d/d3d.cpp index 77b12cf8a0..26c694f9b7 100644 --- a/gfx/d3d/d3d.cpp +++ b/gfx/d3d/d3d.cpp @@ -913,29 +913,25 @@ static bool d3d_has_windowed(void *data) static void d3d_set_aspect_ratio(void *data, unsigned aspect_ratio_idx) { d3d_video_t *d3d = (d3d_video_t*)data; - enum rarch_display_ctl_state cmd = RARCH_DISPLAY_CTL_NONE; switch (aspect_ratio_idx) { case ASPECT_RATIO_SQUARE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL; + video_driver_set_viewport_square_pixel(); break; case ASPECT_RATIO_CORE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE; + video_driver_set_viewport_core(); break; case ASPECT_RATIO_CONFIG: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG; + video_driver_set_viewport_config(); break; default: break; } - if (cmd != RARCH_DISPLAY_CTL_NONE) - video_driver_ctl(cmd, NULL); - video_driver_set_aspect_ratio_value(aspectratio_lut[aspect_ratio_idx].value); if (!d3d) @@ -1129,7 +1125,7 @@ static void *d3d_init(const video_info_t *info, input_driver_set(input, input_data); - video_driver_ctl(RARCH_DISPLAY_CTL_SET_OWN_DRIVER, NULL); + video_driver_set_own_driver(); return d3d; } } @@ -1168,8 +1164,8 @@ static void *d3d_init(const video_info_t *info, d3d->keep_aspect = info->force_aspect; #ifdef _XBOX - video_driver_ctl(RARCH_DISPLAY_CTL_SET_OWN_DRIVER, NULL); - video_driver_ctl(RARCH_INPUT_CTL_SET_OWN_DRIVER, NULL); + video_driver_set_own_driver(); + video_input_ctl(RARCH_INPUT_CTL_SET_OWN_DRIVER, NULL); #endif return d3d; diff --git a/gfx/d3d/render_chain_xdk.cpp b/gfx/d3d/render_chain_xdk.cpp index a18dc19032..3f1a4dc6a2 100644 --- a/gfx/d3d/render_chain_xdk.cpp +++ b/gfx/d3d/render_chain_xdk.cpp @@ -398,7 +398,7 @@ static bool xdk_renderchain_render(void *data, const void *frame, settings_t *settings = config_get_ptr(); xdk_renderchain_t *chain = (xdk_renderchain_t*)d3d->renderchain_data; - video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); + frame_count = video_driver_get_frame_count_ptr(); video_driver_get_size(&width, &height); diff --git a/gfx/drivers/ctr_gfx.c b/gfx/drivers/ctr_gfx.c index 5f47769f48..31919122f2 100644 --- a/gfx/drivers/ctr_gfx.c +++ b/gfx/drivers/ctr_gfx.c @@ -961,29 +961,25 @@ static void ctr_set_filtering(void* data, unsigned index, bool smooth) static void ctr_set_aspect_ratio(void* data, unsigned aspect_ratio_idx) { ctr_video_t *ctr = (ctr_video_t*)data; - enum rarch_display_ctl_state cmd = RARCH_DISPLAY_CTL_NONE; switch (aspect_ratio_idx) { case ASPECT_RATIO_SQUARE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL; + video_driver_set_viewport_square_pixel(); break; case ASPECT_RATIO_CORE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE; + video_driver_set_viewport_core(); break; case ASPECT_RATIO_CONFIG: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG; + video_driver_set_viewport_config(); break; default: break; } - if (cmd != RARCH_DISPLAY_CTL_NONE) - video_driver_ctl(cmd, NULL); - video_driver_set_aspect_ratio_value(aspectratio_lut[aspect_ratio_idx].value); ctr->keep_aspect = true; diff --git a/gfx/drivers/exynos_gfx.c b/gfx/drivers/exynos_gfx.c index bdcfa55911..3b86a97257 100644 --- a/gfx/drivers/exynos_gfx.c +++ b/gfx/drivers/exynos_gfx.c @@ -1402,29 +1402,25 @@ static void exynos_gfx_viewport_info(void *data, struct video_viewport *vp) static void exynos_set_aspect_ratio(void *data, unsigned aspect_ratio_idx) { struct exynos_video *vid = (struct exynos_video*)data; - enum rarch_display_ctl_state cmd = RARCH_DISPLAY_CTL_NONE; switch (aspect_ratio_idx) { case ASPECT_RATIO_SQUARE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL; + video_driver_set_viewport_square_pixel(); break; case ASPECT_RATIO_CORE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE; + video_driver_set_viewport_core(); break; case ASPECT_RATIO_CONFIG: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG; + video_driver_set_viewport_config(); break; default: break; } - if (cmd != RARCH_DISPLAY_CTL_NONE) - video_driver_ctl(cmd, NULL); - video_driver_set_aspect_ratio_value(aspectratio_lut[aspect_ratio_idx].value); vid->aspect_changed = true; } diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 68da573c1d..e06ca87be0 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -1480,7 +1480,7 @@ static INLINE void gl_copy_frame(gl_t *gl, const void *frame, else #endif { - bool use_rgba = video_driver_ctl(RARCH_DISPLAY_CTL_SUPPORTS_RGBA, NULL); + bool use_rgba = video_driver_supports_rgba(); glPixelStorei(GL_UNPACK_ALIGNMENT, video_pixel_get_alignment(width * gl->base_size)); @@ -2253,7 +2253,7 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) RARCH_LOG("[GL]: BGRA8888 extension found for GLES.\n"); else { - video_driver_ctl(RARCH_DISPLAY_CTL_SET_RGBA, NULL); + video_driver_set_rgba(); RARCH_WARN("[GL]: GLES implementation does not have BGRA8888 extension.\n" "32-bit path will require conversion.\n"); } diff --git a/gfx/drivers/gx_gfx.c b/gfx/drivers/gx_gfx.c index af95198bff..3b483a111b 100644 --- a/gfx/drivers/gx_gfx.c +++ b/gfx/drivers/gx_gfx.c @@ -472,29 +472,25 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines, static void gx_set_aspect_ratio(void *data, unsigned aspect_ratio_idx) { gx_video_t *gx = (gx_video_t*)data; - enum rarch_display_ctl_state cmd = RARCH_DISPLAY_CTL_NONE; switch (aspect_ratio_idx) { case ASPECT_RATIO_SQUARE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL; + video_driver_set_viewport_square_pixel(); break; case ASPECT_RATIO_CORE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE; + video_driver_set_viewport_core(); break; case ASPECT_RATIO_CONFIG: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG; + video_driver_set_viewport_config(); break; default: break; } - if (cmd != RARCH_DISPLAY_CTL_NONE) - video_driver_ctl(cmd, NULL); - video_driver_set_aspect_ratio_value( aspectratio_lut[aspect_ratio_idx].value); diff --git a/gfx/drivers/psp1_gfx.c b/gfx/drivers/psp1_gfx.c index ed4c96605d..54d11a2408 100644 --- a/gfx/drivers/psp1_gfx.c +++ b/gfx/drivers/psp1_gfx.c @@ -793,29 +793,25 @@ static void psp_set_filtering(void *data, unsigned index, bool smooth) static void psp_set_aspect_ratio(void *data, unsigned aspect_ratio_idx) { psp1_video_t *psp = (psp1_video_t*)data; - enum rarch_display_ctl_state cmd = RARCH_DISPLAY_CTL_NONE; switch (aspect_ratio_idx) { case ASPECT_RATIO_SQUARE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL; + video_driver_set_viewport_square_pixel(); break; case ASPECT_RATIO_CORE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE; + video_driver_set_viewport_core(); break; case ASPECT_RATIO_CONFIG: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG; + video_driver_set_viewport_config(); break; default: break; } - if (cmd != RARCH_DISPLAY_CTL_NONE) - video_driver_ctl(cmd, NULL); - video_driver_set_aspect_ratio_value(aspectratio_lut[aspect_ratio_idx].value); psp->keep_aspect = true; diff --git a/gfx/drivers/sdl2_gfx.c b/gfx/drivers/sdl2_gfx.c index 8b894363ee..1729561738 100644 --- a/gfx/drivers/sdl2_gfx.c +++ b/gfx/drivers/sdl2_gfx.c @@ -629,7 +629,7 @@ static bool sdl2_gfx_read_viewport(void *data, uint8_t *buffer) rarch_perf_init(&sdl2_gfx_read_viewport, "sdl2_gfx_read_viewport"); retro_perf_start(&sdl2_gfx_read_viewport); - video_driver_ctl(RARCH_DISPLAY_CTL_CACHED_FRAME_RENDER, NULL); + video_driver_cached_frame_render(); surf = SDL_GetWindowSurface(vid->window); bgr24 = SDL_ConvertSurfaceFormat(surf, SDL_PIXELFORMAT_BGR24, 0); @@ -658,29 +658,25 @@ static void sdl2_poke_set_filtering(void *data, unsigned index, bool smooth) static void sdl2_poke_set_aspect_ratio(void *data, unsigned aspect_ratio_idx) { sdl2_video_t *vid = (sdl2_video_t*)data; - enum rarch_display_ctl_state cmd = RARCH_DISPLAY_CTL_NONE; switch (aspect_ratio_idx) { case ASPECT_RATIO_SQUARE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL; + video_driver_set_viewport_square_pixel(); break; case ASPECT_RATIO_CORE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE; + video_driver_set_viewport_core(); break; case ASPECT_RATIO_CONFIG: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG; + video_driver_set_viewport_config(); break; default: break; } - if (cmd != RARCH_DISPLAY_CTL_NONE) - video_driver_ctl(cmd, NULL); - video_driver_set_aspect_ratio_value(aspectratio_lut[aspect_ratio_idx].value); vid->video.force_aspect = true; diff --git a/gfx/drivers/vita2d_gfx.c b/gfx/drivers/vita2d_gfx.c index da8b79921e..d982fe420a 100644 --- a/gfx/drivers/vita2d_gfx.c +++ b/gfx/drivers/vita2d_gfx.c @@ -489,29 +489,25 @@ static void vita_set_filtering(void *data, unsigned index, bool smooth) static void vita_set_aspect_ratio(void *data, unsigned aspect_ratio_idx) { vita_video_t *vita = (vita_video_t*)data; - enum rarch_display_ctl_state cmd = RARCH_DISPLAY_CTL_NONE; switch (aspect_ratio_idx) { case ASPECT_RATIO_SQUARE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_SQUARE_PIXEL; + video_driver_set_viewport_square_pixel(); break; case ASPECT_RATIO_CORE: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CORE; + video_driver_set_viewport_core(); break; case ASPECT_RATIO_CONFIG: - cmd = RARCH_DISPLAY_CTL_SET_VIEWPORT_CONFIG; + video_driver_set_viewport_config(); break; default: break; } - if (cmd != RARCH_DISPLAY_CTL_NONE) - video_driver_ctl(cmd, NULL); - video_driver_set_aspect_ratio_value(aspectratio_lut[aspect_ratio_idx].value); vita->keep_aspect = true; diff --git a/gfx/drivers_context/sdl_gl_ctx.c b/gfx/drivers_context/sdl_gl_ctx.c index c5c9ef890c..caaccbd653 100644 --- a/gfx/drivers_context/sdl_gl_ctx.c +++ b/gfx/drivers_context/sdl_gl_ctx.c @@ -200,7 +200,7 @@ static bool sdl_ctx_set_video_mode(void *data, unsigned width, unsigned height, #ifdef HAVE_SDL2 if (sdl->g_ctx) - video_driver_ctl(RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT_ACK, NULL); + video_driver_set_video_cache_context_ack(); else { sdl->g_ctx = SDL_GL_CreateContext(sdl->g_win); diff --git a/gfx/drivers_context/wgl_ctx.cpp b/gfx/drivers_context/wgl_ctx.cpp index b7f24019f5..d8b687b7f1 100644 --- a/gfx/drivers_context/wgl_ctx.cpp +++ b/gfx/drivers_context/wgl_ctx.cpp @@ -102,7 +102,7 @@ void create_gl_context(HWND hwnd, bool *quit) struct retro_hw_render_callback *hwr = NULL; bool debug = false; - video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr); + hwr = video_driver_get_hw_context(); debug = hwr->debug_context; #ifdef _WIN32 @@ -119,7 +119,7 @@ void create_gl_context(HWND hwnd, bool *quit) if (g_hrc) { RARCH_LOG("[WGL]: Using cached GL context.\n"); - video_driver_ctl(RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT_ACK, NULL); + video_driver_set_video_cache_context_ack(); } else { @@ -329,7 +329,7 @@ static void gfx_ctx_wgl_destroy(void *data) glFinish(); wglMakeCurrent(NULL, NULL); - if (!video_driver_ctl(RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT, NULL)) + if (!video_driver_is_video_cache_context()) { if (g_hw_hrc) wglDeleteContext(g_hw_hrc); diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index 7de8fdea33..c8be598441 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -341,7 +341,7 @@ static void android_input_poll_main_cmd(void) runloop_ctl(RUNLOOP_CTL_SET_IDLE, &boolean); #ifdef HAVE_MENU menu_display_ctl(MENU_DISPLAY_CTL_UNSET_STUB_DRAW_FRAME, NULL); - video_driver_ctl(RARCH_DISPLAY_CTL_UNSET_STUB_FRAME, NULL); + video_driver_unset_stub_frame(); #endif if ((android_app->sensor_state_mask @@ -364,7 +364,7 @@ static void android_input_poll_main_cmd(void) runloop_ctl(RUNLOOP_CTL_SET_IDLE, &boolean); #ifdef HAVE_MENU menu_display_ctl(MENU_DISPLAY_CTL_SET_STUB_DRAW_FRAME, NULL); - video_driver_ctl(RARCH_DISPLAY_CTL_SET_STUB_FRAME, NULL); + video_driver_set_stub_frame(); #endif /* Avoid draining battery while app is not being used. */ diff --git a/menu/drivers/xui.cpp b/menu/drivers/xui.cpp index b06efdefc9..705ecf2714 100644 --- a/menu/drivers/xui.cpp +++ b/menu/drivers/xui.cpp @@ -534,7 +534,7 @@ static void xui_render(void *data) const char *label = NULL; unsigned menu_type = 0; - video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); + frame_count = video_driver_get_frame_count_ptr(); menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); menu_display_ctl(MENU_DISPLAY_CTL_MSG_FORCE, &msg_force); From 8870e853957758c396fdc4a3d6e918e6345500f3 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sun, 8 May 2016 14:18:12 +0200 Subject: [PATCH 8/8] More fixes for menu_display_ctl. Grep shows nothing now. --- gfx/drivers/gx_gfx.c | 16 +- input/drivers/android_input.c | 2 - menu/drivers/nk_common.c | 554 +++++++++++----------- menu/drivers/nuklear.c | 21 +- menu/drivers/xui.cpp | 12 +- menu/drivers_display/menu_display_d3d.cpp | 2 +- 6 files changed, 300 insertions(+), 307 deletions(-) diff --git a/gfx/drivers/gx_gfx.c b/gfx/drivers/gx_gfx.c index 3b483a111b..db5a246816 100644 --- a/gfx/drivers/gx_gfx.c +++ b/gfx/drivers/gx_gfx.c @@ -413,9 +413,9 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines, new_fb_pitch = new_fb_width * 2; - menu_display_ctl(MENU_DISPLAY_CTL_SET_WIDTH, &new_fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_SET_HEIGHT, &new_fb_height); - menu_display_ctl(MENU_DISPLAY_CTL_SET_FB_PITCH, &new_fb_pitch); + menu_display_set_width(new_fb_width); + menu_display_set_height(new_fb_height); + menu_display_set_framebuffer_pitch(new_fb_pitch); GX_SetViewportJitter(0, 0, gx_mode.fbWidth, gx_mode.efbHeight, 0, 1, 1); GX_SetDispCopySrc(0, 0, gx_mode.fbWidth, gx_mode.efbHeight); @@ -551,8 +551,8 @@ static void init_texture(void *data, unsigned width, unsigned height) menu_w = 320; menu_h = 240; - menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &menu_w); - menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &menu_h); + menu_w = menu_display_get_width(); + menu_h = menu_display_get_height(); GX_InitTexObj(fb_ptr, g_tex.data, width, height, (gx->rgb32) ? GX_TF_RGBA8 : gx->menu_texture_enable ? @@ -1492,9 +1492,9 @@ static bool gx_frame(void *data, const void *frame, size_t fb_pitch; unsigned fb_width, fb_height; - menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_HEIGHT, &fb_height); - menu_display_ctl(MENU_DISPLAY_CTL_FB_PITCH, &fb_pitch); + fb_width = menu_display_get_width(); + fb_height = menu_display_get_height(); + fb_pitch = menu_display_get_framebuffer_pitch(); convert_texture16( gx->menu_data, diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index c8be598441..c3f450a9cc 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -340,7 +340,6 @@ static void android_input_poll_main_cmd(void) runloop_ctl(RUNLOOP_CTL_SET_PAUSED, &boolean); runloop_ctl(RUNLOOP_CTL_SET_IDLE, &boolean); #ifdef HAVE_MENU - menu_display_ctl(MENU_DISPLAY_CTL_UNSET_STUB_DRAW_FRAME, NULL); video_driver_unset_stub_frame(); #endif @@ -363,7 +362,6 @@ static void android_input_poll_main_cmd(void) runloop_ctl(RUNLOOP_CTL_SET_PAUSED, &boolean); runloop_ctl(RUNLOOP_CTL_SET_IDLE, &boolean); #ifdef HAVE_MENU - menu_display_ctl(MENU_DISPLAY_CTL_SET_STUB_DRAW_FRAME, NULL); video_driver_set_stub_frame(); #endif diff --git a/menu/drivers/nk_common.c b/menu/drivers/nk_common.c index 13823f0504..1edd4f6e16 100644 --- a/menu/drivers/nk_common.c +++ b/menu/drivers/nk_common.c @@ -1,279 +1,279 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2016 - Daniel De Matteis - * Copyright (C) 2014-2015 - Jean-Andr� Santoni - * Copyright (C) 2016 - Andr�s Su�rez - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#include - -#define NK_INCLUDE_FIXED_TYPES -#define NK_INCLUDE_STANDARD_IO -#define NK_INCLUDE_DEFAULT_ALLOCATOR -#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT -#define NK_INCLUDE_FONT_BAKING +/* RetroArch - A frontend for libretro. + * Copyright (C) 2011-2016 - Daniel De Matteis + * Copyright (C) 2014-2015 - Jean-Andr� Santoni + * Copyright (C) 2016 - Andr�s Su�rez + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include + +#define NK_INCLUDE_FIXED_TYPES +#define NK_INCLUDE_STANDARD_IO +#define NK_INCLUDE_DEFAULT_ALLOCATOR +#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT +#define NK_INCLUDE_FONT_BAKING #define NK_INCLUDE_DEFAULT_FONT #define NK_IMPLEMENTATION - -#include "nk_common.h" - -#include "../menu_display.h" -#include "../../gfx/video_shader_driver.h" - -#include "../../gfx/drivers/gl_shaders/pipeline_zahnrad.glsl.vert.h" -#include "../../gfx/drivers/gl_shaders/pipeline_zahnrad.glsl.frag.h" - -struct nk_font *font; -struct nk_font_atlas atlas; -struct nk_user_font usrfnt; -struct nk_allocator nk_alloc; -struct nk_device device; - -struct nk_image nk_common_image_load(const char *filename) -{ - int x,y,n; - GLuint tex; - unsigned char *data = stbi_load(filename, &x, &y, &n, 0); - if (!data) printf("Failed to load image: %s\n", filename); - -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) - glGenTextures(1, &tex); - glBindTexture(GL_TEXTURE_2D, tex); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - glGenerateMipmap(GL_TEXTURE_2D); -#endif - - stbi_image_free(data); - return nk_image_id((int)tex); -} - -char* nk_common_file_load(const char* path, size_t* size) -{ - void *buf; - ssize_t *length = (ssize_t*)size; - filestream_read_file(path, &buf, length); - return (char*)buf; -} - -NK_API void nk_common_device_init(struct nk_device *dev) -{ -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) - GLint status; - - dev->prog = glCreateProgram(); - dev->vert_shdr = glCreateShader(GL_VERTEX_SHADER); - dev->frag_shdr = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(dev->vert_shdr, 1, &zahnrad_vertex_shader, 0); - glShaderSource(dev->frag_shdr, 1, &zahnrad_fragment_shader, 0); - glCompileShader(dev->vert_shdr); - glCompileShader(dev->frag_shdr); - glGetShaderiv(dev->vert_shdr, GL_COMPILE_STATUS, &status); - glGetShaderiv(dev->frag_shdr, GL_COMPILE_STATUS, &status); - glAttachShader(dev->prog, dev->vert_shdr); - glAttachShader(dev->prog, dev->frag_shdr); - glLinkProgram(dev->prog); - glGetProgramiv(dev->prog, GL_LINK_STATUS, &status); - - dev->uniform_proj = glGetUniformLocation(dev->prog, "ProjMtx"); - dev->attrib_pos = glGetAttribLocation(dev->prog, "Position"); - dev->attrib_uv = glGetAttribLocation(dev->prog, "TexCoord"); - dev->attrib_col = glGetAttribLocation(dev->prog, "Color"); - - { - /* buffer setup */ - GLsizei vs = sizeof(struct nk_draw_vertex); - size_t vp = offsetof(struct nk_draw_vertex, position); - size_t vt = offsetof(struct nk_draw_vertex, uv); - size_t vc = offsetof(struct nk_draw_vertex, col); - - glGenBuffers(1, &dev->vbo); - glGenBuffers(1, &dev->ebo); - glGenVertexArrays(1, &dev->vao); - - glBindVertexArray(dev->vao); - glBindBuffer(GL_ARRAY_BUFFER, dev->vbo); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dev->ebo); - - glEnableVertexAttribArray((GLuint)dev->attrib_pos); - glEnableVertexAttribArray((GLuint)dev->attrib_uv); - glEnableVertexAttribArray((GLuint)dev->attrib_col); - - glVertexAttribPointer((GLuint)dev->attrib_pos, 2, GL_FLOAT, GL_FALSE, vs, (void*)vp); - glVertexAttribPointer((GLuint)dev->attrib_uv, 2, GL_FLOAT, GL_FALSE, vs, (void*)vt); - glVertexAttribPointer((GLuint)dev->attrib_col, 4, GL_UNSIGNED_BYTE, GL_TRUE, vs, (void*)vc); - } - - glBindTexture(GL_TEXTURE_2D, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindVertexArray(0); -#endif -} - -void device_upload_atlas(struct nk_device *dev, const void *image, int width, int height) -{ - glGenTextures(1, &dev->font_tex); - glBindTexture(GL_TEXTURE_2D, dev->font_tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image); -} - -void nk_common_device_shutdown(struct nk_device *dev) -{ -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) - glDetachShader(dev->prog, dev->vert_shdr); - glDetachShader(dev->prog, dev->frag_shdr); - glDeleteShader(dev->vert_shdr); - glDeleteShader(dev->frag_shdr); - glDeleteProgram(dev->prog); - glDeleteTextures(1, &dev->font_tex); - glDeleteBuffers(1, &dev->vbo); - glDeleteBuffers(1, &dev->ebo); -#endif -} - -void nk_common_device_draw(struct nk_device *dev, - struct nk_context *ctx, int width, int height, - enum nk_anti_aliasing AA) -{ - video_shader_ctx_info_t shader_info; - struct nk_buffer vbuf, ebuf; - struct nk_convert_config config; - uintptr_t last_prog; - const struct nk_draw_command *cmd = NULL; - void *vertices = NULL; - void *elements = NULL; - const nk_draw_index *offset = NULL; -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) - GLint last_tex; - GLint last_ebo, last_vbo, last_vao; - GLfloat ortho[4][4] = { - {2.0f, 0.0f, 0.0f, 0.0f}, - {0.0f,-2.0f, 0.0f, 0.0f}, - {0.0f, 0.0f,-1.0f, 0.0f}, - {-1.0f,1.0f, 0.0f, 1.0f}, - }; - ortho[0][0] /= (GLfloat)width; - ortho[1][1] /= (GLfloat)height; - - /* save previous opengl state */ - glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_prog); - glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_tex); - glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_vao); - glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_ebo); - glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vbo); -#endif - - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); - -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) - glActiveTexture(GL_TEXTURE0); -#endif - - /* setup program */ - shader_info.data = NULL; - shader_info.idx = dev->prog; - shader_info.set_active = false; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); - -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) - glUniformMatrix4fv(dev->uniform_proj, 1, GL_FALSE, &ortho[0][0]); - - /* convert from command queue into draw list and draw to screen */ - - /* allocate vertex and element buffer */ - glBindVertexArray(dev->vao); - glBindBuffer(GL_ARRAY_BUFFER, dev->vbo); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dev->ebo); - - glBufferData(GL_ARRAY_BUFFER, MAX_VERTEX_MEMORY, NULL, GL_STREAM_DRAW); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, MAX_ELEMENT_MEMORY, NULL, GL_STREAM_DRAW); - - /* load draw vertices & elements directly into vertex + element buffer */ - vertices = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - elements = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); -#endif - - /* fill converting configuration */ - memset(&config, 0, sizeof(config)); - - config.global_alpha = 1.0f; - config.shape_AA = AA; - config.line_AA = AA; - config.circle_segment_count = 22; - //config.line_thickness = 1.0f; - config.null = dev->null; - - /* setup buffers to load vertices and elements */ - nk_buffer_init_fixed(&vbuf, vertices, MAX_VERTEX_MEMORY); - nk_buffer_init_fixed(&ebuf, elements, MAX_ELEMENT_MEMORY); - nk_convert(ctx, &dev->cmds, &vbuf, &ebuf, &config); - -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) - glUnmapBuffer(GL_ARRAY_BUFFER); - glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); -#endif - - /* iterate over and execute each draw command */ - nk_draw_foreach(cmd, ctx, &dev->cmds) - { - if (!cmd->elem_count) - continue; - -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) - glBindTexture(GL_TEXTURE_2D, (GLuint)cmd->texture.id); - glScissor((GLint)cmd->clip_rect.x, - height - (GLint)(cmd->clip_rect.y + cmd->clip_rect.h), - (GLint)cmd->clip_rect.w, (GLint)cmd->clip_rect.h); - glDrawElements(GL_TRIANGLES, (GLsizei)cmd->elem_count, - GL_UNSIGNED_SHORT, offset); -#endif - - offset += cmd->elem_count; - } - nk_clear(ctx); - - /* restore old state */ - shader_info.data = NULL; - shader_info.idx = (GLint)last_prog; - shader_info.set_active = false; - video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); - -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) - glBindTexture(GL_TEXTURE_2D, (GLuint)last_tex); - glBindBuffer(GL_ARRAY_BUFFER, (GLuint)last_vbo); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (GLuint)last_ebo); - glBindVertexArray((GLuint)last_vao); -#endif - - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); -} - -//void nk_mem_alloc(nk_handle a, void *old, nk_size b); -void* nk_common_mem_alloc(nk_handle a, void *old, nk_size b) -{ - (void)a; - return calloc(1, b); -} - -void nk_common_mem_free(nk_handle unused, void *ptr) -{ - (void)unused; - free(ptr); -} + +#include "nk_common.h" + +#include "../menu_display.h" +#include "../../gfx/video_shader_driver.h" + +#include "../../gfx/drivers/gl_shaders/pipeline_zahnrad.glsl.vert.h" +#include "../../gfx/drivers/gl_shaders/pipeline_zahnrad.glsl.frag.h" + +struct nk_font *font; +struct nk_font_atlas atlas; +struct nk_user_font usrfnt; +struct nk_allocator nk_alloc; +struct nk_device device; + +struct nk_image nk_common_image_load(const char *filename) +{ + int x,y,n; + GLuint tex; + unsigned char *data = stbi_load(filename, &x, &y, &n, 0); + if (!data) printf("Failed to load image: %s\n", filename); + +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + glGenerateMipmap(GL_TEXTURE_2D); +#endif + + stbi_image_free(data); + return nk_image_id((int)tex); +} + +char* nk_common_file_load(const char* path, size_t* size) +{ + void *buf; + ssize_t *length = (ssize_t*)size; + filestream_read_file(path, &buf, length); + return (char*)buf; +} + +NK_API void nk_common_device_init(struct nk_device *dev) +{ +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + GLint status; + + dev->prog = glCreateProgram(); + dev->vert_shdr = glCreateShader(GL_VERTEX_SHADER); + dev->frag_shdr = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(dev->vert_shdr, 1, &zahnrad_vertex_shader, 0); + glShaderSource(dev->frag_shdr, 1, &zahnrad_fragment_shader, 0); + glCompileShader(dev->vert_shdr); + glCompileShader(dev->frag_shdr); + glGetShaderiv(dev->vert_shdr, GL_COMPILE_STATUS, &status); + glGetShaderiv(dev->frag_shdr, GL_COMPILE_STATUS, &status); + glAttachShader(dev->prog, dev->vert_shdr); + glAttachShader(dev->prog, dev->frag_shdr); + glLinkProgram(dev->prog); + glGetProgramiv(dev->prog, GL_LINK_STATUS, &status); + + dev->uniform_proj = glGetUniformLocation(dev->prog, "ProjMtx"); + dev->attrib_pos = glGetAttribLocation(dev->prog, "Position"); + dev->attrib_uv = glGetAttribLocation(dev->prog, "TexCoord"); + dev->attrib_col = glGetAttribLocation(dev->prog, "Color"); + + { + /* buffer setup */ + GLsizei vs = sizeof(struct nk_draw_vertex); + size_t vp = offsetof(struct nk_draw_vertex, position); + size_t vt = offsetof(struct nk_draw_vertex, uv); + size_t vc = offsetof(struct nk_draw_vertex, col); + + glGenBuffers(1, &dev->vbo); + glGenBuffers(1, &dev->ebo); + glGenVertexArrays(1, &dev->vao); + + glBindVertexArray(dev->vao); + glBindBuffer(GL_ARRAY_BUFFER, dev->vbo); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dev->ebo); + + glEnableVertexAttribArray((GLuint)dev->attrib_pos); + glEnableVertexAttribArray((GLuint)dev->attrib_uv); + glEnableVertexAttribArray((GLuint)dev->attrib_col); + + glVertexAttribPointer((GLuint)dev->attrib_pos, 2, GL_FLOAT, GL_FALSE, vs, (void*)vp); + glVertexAttribPointer((GLuint)dev->attrib_uv, 2, GL_FLOAT, GL_FALSE, vs, (void*)vt); + glVertexAttribPointer((GLuint)dev->attrib_col, 4, GL_UNSIGNED_BYTE, GL_TRUE, vs, (void*)vc); + } + + glBindTexture(GL_TEXTURE_2D, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glBindVertexArray(0); +#endif +} + +void device_upload_atlas(struct nk_device *dev, const void *image, int width, int height) +{ + glGenTextures(1, &dev->font_tex); + glBindTexture(GL_TEXTURE_2D, dev->font_tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, image); +} + +void nk_common_device_shutdown(struct nk_device *dev) +{ +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + glDetachShader(dev->prog, dev->vert_shdr); + glDetachShader(dev->prog, dev->frag_shdr); + glDeleteShader(dev->vert_shdr); + glDeleteShader(dev->frag_shdr); + glDeleteProgram(dev->prog); + glDeleteTextures(1, &dev->font_tex); + glDeleteBuffers(1, &dev->vbo); + glDeleteBuffers(1, &dev->ebo); +#endif +} + +void nk_common_device_draw(struct nk_device *dev, + struct nk_context *ctx, int width, int height, + enum nk_anti_aliasing AA) +{ + video_shader_ctx_info_t shader_info; + struct nk_buffer vbuf, ebuf; + struct nk_convert_config config; + uintptr_t last_prog; + const struct nk_draw_command *cmd = NULL; + void *vertices = NULL; + void *elements = NULL; + const nk_draw_index *offset = NULL; +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + GLint last_tex; + GLint last_ebo, last_vbo, last_vao; + GLfloat ortho[4][4] = { + {2.0f, 0.0f, 0.0f, 0.0f}, + {0.0f,-2.0f, 0.0f, 0.0f}, + {0.0f, 0.0f,-1.0f, 0.0f}, + {-1.0f,1.0f, 0.0f, 1.0f}, + }; + ortho[0][0] /= (GLfloat)width; + ortho[1][1] /= (GLfloat)height; + + /* save previous opengl state */ + glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_prog); + glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_tex); + glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_vao); + glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_ebo); + glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vbo); +#endif + + menu_display_blend_begin(); + +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + glActiveTexture(GL_TEXTURE0); +#endif + + /* setup program */ + shader_info.data = NULL; + shader_info.idx = dev->prog; + shader_info.set_active = false; + video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + glUniformMatrix4fv(dev->uniform_proj, 1, GL_FALSE, &ortho[0][0]); + + /* convert from command queue into draw list and draw to screen */ + + /* allocate vertex and element buffer */ + glBindVertexArray(dev->vao); + glBindBuffer(GL_ARRAY_BUFFER, dev->vbo); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dev->ebo); + + glBufferData(GL_ARRAY_BUFFER, MAX_VERTEX_MEMORY, NULL, GL_STREAM_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, MAX_ELEMENT_MEMORY, NULL, GL_STREAM_DRAW); + + /* load draw vertices & elements directly into vertex + element buffer */ + vertices = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); + elements = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); +#endif + + /* fill converting configuration */ + memset(&config, 0, sizeof(config)); + + config.global_alpha = 1.0f; + config.shape_AA = AA; + config.line_AA = AA; + config.circle_segment_count = 22; + //config.line_thickness = 1.0f; + config.null = dev->null; + + /* setup buffers to load vertices and elements */ + nk_buffer_init_fixed(&vbuf, vertices, MAX_VERTEX_MEMORY); + nk_buffer_init_fixed(&ebuf, elements, MAX_ELEMENT_MEMORY); + nk_convert(ctx, &dev->cmds, &vbuf, &ebuf, &config); + +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + glUnmapBuffer(GL_ARRAY_BUFFER); + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); +#endif + + /* iterate over and execute each draw command */ + nk_draw_foreach(cmd, ctx, &dev->cmds) + { + if (!cmd->elem_count) + continue; + +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + glBindTexture(GL_TEXTURE_2D, (GLuint)cmd->texture.id); + glScissor((GLint)cmd->clip_rect.x, + height - (GLint)(cmd->clip_rect.y + cmd->clip_rect.h), + (GLint)cmd->clip_rect.w, (GLint)cmd->clip_rect.h); + glDrawElements(GL_TRIANGLES, (GLsizei)cmd->elem_count, + GL_UNSIGNED_SHORT, offset); +#endif + + offset += cmd->elem_count; + } + nk_clear(ctx); + + /* restore old state */ + shader_info.data = NULL; + shader_info.idx = (GLint)last_prog; + shader_info.set_active = false; + video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + glBindTexture(GL_TEXTURE_2D, (GLuint)last_tex); + glBindBuffer(GL_ARRAY_BUFFER, (GLuint)last_vbo); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (GLuint)last_ebo); + glBindVertexArray((GLuint)last_vao); +#endif + + menu_display_blend_end(); +} + +//void nk_mem_alloc(nk_handle a, void *old, nk_size b); +void* nk_common_mem_alloc(nk_handle a, void *old, nk_size b) +{ + (void)a; + return calloc(1, b); +} + +void nk_common_mem_free(nk_handle unused, void *ptr) +{ + (void)unused; + free(ptr); +} diff --git a/menu/drivers/nuklear.c b/menu/drivers/nuklear.c index cb6ba15b3d..598c5f9cca 100644 --- a/menu/drivers/nuklear.c +++ b/menu/drivers/nuklear.c @@ -174,15 +174,14 @@ static void nk_menu_frame(void *data) nk_menu_handle_t *nk = (nk_menu_handle_t*)data; settings_t *settings = config_get_ptr(); - bool libretro_running = menu_display_ctl( - MENU_DISPLAY_CTL_LIBRETRO_RUNNING, NULL); + bool libretro_running = menu_display_libretro_running(); if (!nk) return; video_driver_get_size(&width, &height); - menu_display_ctl(MENU_DISPLAY_CTL_SET_VIEWPORT, NULL); + menu_display_set_viewport(); nk_input_begin(&nk->ctx); nk_menu_input_gamepad(nk); @@ -212,22 +211,19 @@ static void nk_menu_frame(void *data) width, height); - menu_display_ctl(MENU_DISPLAY_CTL_RESTORE_CLEAR_COLOR, NULL); - menu_display_ctl(MENU_DISPLAY_CTL_UNSET_VIEWPORT, NULL); + menu_display_restore_clear_color(); + menu_display_unset_viewport(); } static void nk_menu_layout(nk_menu_handle_t *nk) { - void *fb_buf; float scale_factor; unsigned width, height, new_header_height; video_driver_get_size(&width, &height); - menu_display_ctl(MENU_DISPLAY_CTL_GET_DPI, &scale_factor); - menu_display_ctl(MENU_DISPLAY_CTL_SET_HEADER_HEIGHT, - &new_header_height); - + scale_factor = menu_display_get_dpi(); + menu_display_set_header_height(new_header_height); } static void nk_menu_init_device(nk_menu_handle_t *nk) @@ -285,7 +281,7 @@ static void *nk_menu_init(void **userdata) if (!menu) goto error; - if (!menu_display_ctl(MENU_DISPLAY_CTL_INIT_FIRST_DRIVER, NULL)) + if (!menu_display_init_first_driver()) goto error; nk = (nk_menu_handle_t*)calloc(1, sizeof(nk_menu_handle_t)); @@ -339,8 +335,7 @@ static void nk_menu_context_destroy(void *data) for (i = 0; i < NK_TEXTURE_LAST; i++) video_driver_texture_unload((uintptr_t*)&nk->textures.list[i]); - menu_display_ctl(MENU_DISPLAY_CTL_FONT_MAIN_DEINIT, NULL); - + menu_display_font_main_deinit(); wimp_context_bg_destroy(nk); } diff --git a/menu/drivers/xui.cpp b/menu/drivers/xui.cpp index 705ecf2714..434580531a 100644 --- a/menu/drivers/xui.cpp +++ b/menu/drivers/xui.cpp @@ -417,7 +417,7 @@ static void xui_frame(void *data) if (!d3dr) return; - menu_display_ctl(MENU_DISPLAY_CTL_SET_VIEWPORT, NULL); + menu_display_set_viewport(); app.RunFrame(); XuiTimersRun(); @@ -445,7 +445,7 @@ static void xui_frame(void *data) XuiRenderEnd( app.GetDC() ); - menu_display_ctl(MENU_DISPLAY_CTL_UNSET_VIEWPORT, NULL); + menu_display_unset_viewport(); } static void blit_line(int x, int y, const char *message, bool green) @@ -454,7 +454,7 @@ static void blit_line(int x, int y, const char *message, bool green) static void xui_render_background(void) { - if (menu_display_ctl(MENU_DISPLAY_CTL_LIBRETRO_RUNNING, NULL)) + if (menu_display_libretro_running()) XuiElementSetShow(m_background, FALSE); else XuiElementSetShow(m_background, TRUE); @@ -536,8 +536,8 @@ static void xui_render(void *data) frame_count = video_driver_get_frame_count_ptr(); - menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); - menu_display_ctl(MENU_DISPLAY_CTL_MSG_FORCE, &msg_force); + fb_width = menu_display_get_width(); + msg_force = menu_display_get_msg_force(); if ( menu_entries_ctl(MENU_ENTRIES_CTL_NEEDS_REFRESH, NULL) @@ -546,7 +546,7 @@ static void xui_render(void *data) ) return; - menu_display_ctl(MENU_DISPLAY_CTL_UNSET_FRAMEBUFFER_DIRTY_FLAG, NULL); + menu_display_unset_framebuffer_dirty_flag(); menu_animation_ctl(MENU_ANIMATION_CTL_CLEAR_ACTIVE, NULL); xui_render_background(); diff --git a/menu/drivers_display/menu_display_d3d.cpp b/menu/drivers_display/menu_display_d3d.cpp index c6b7e08848..fe00476e51 100644 --- a/menu/drivers_display/menu_display_d3d.cpp +++ b/menu/drivers_display/menu_display_d3d.cpp @@ -186,7 +186,7 @@ static void menu_display_d3d_draw_pipeline(void *data) static float t = 0; gfx_coord_array_t *ca = NULL; - menu_display_ctl(MENU_DISPLAY_CTL_COORDS_ARRAY_GET, &ca); + ca = menu_display_get_coords_array(); draw->x = 0; draw->y = 0;