diff --git a/bezel/koko-aio/FXAA-bloom.slangp b/bezel/koko-aio/FXAA-bloom.slangp
new file mode 100644
index 0000000..6d258c4
--- /dev/null
+++ b/bezel/koko-aio/FXAA-bloom.slangp
@@ -0,0 +1,250 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+SATURATION = "1.100000"
+GAMMA_OUT = "0.500000"
+DO_FXAA = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_PAL = "1.000000"
+SAT_BLEED_STRENGTH = "0.500000"
+SAT_BLEED_SIZE_LEFT = "3.000000"
+SAT_BLEED_SIZE_RIGHT = "3.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.300000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.425000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.100000"
+SCANLINE_DARK = "0.700000"
+SCANLINE_COMPENSATION = "0.200000"
+SCANLINES_BLEEDING = "1.000000"
+SCANLINE_FLICKERING = "0.000000"
+SCANLINE_FLICKERING_POWER = "0.500000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "0.750000"
+BLOOM_GAMMA_OUT = "1.000000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.500000"
+GEOM_WARP_Y = "0.500000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_INNER_ZOOM = "-0.005000"
+BEZEL_FRAME_ZOOM = "0.139000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "5.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/LICENSE b/bezel/koko-aio/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/bezel/koko-aio/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program 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 Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/bezel/koko-aio/docs.md b/bezel/koko-aio/docs.md
new file mode 100644
index 0000000..a0e80c9
--- /dev/null
+++ b/bezel/koko-aio/docs.md
@@ -0,0 +1,237 @@
+**koko-aio-slang parameters documentation**
+
+
+**Shift RGB components:**
+ Shift R,G,B components separately to mimic chroma
+ dephasing and color aberrations.
+ By varying Red, Green and Blue offsets, the relative component will be
+ shifted column by column, row by row.
+
+**Saturated color bleeding:**
+ Will cause an horizontal chroma bleed which cheaply mimics the effect of
+ poor composite video signals.
+ It can be used with RGB shifting and image blurring to give the picture
+ an ntsc look without dealing with specific encoding/decoding stuffs.
+
+**Color corrections:**
+ Modify luminance, saturation, contrast, brightness and color temperature of the
+ "input" signal.
+ Gamma correction is applied to the final processed picture.
+
+**FXAA:**
+ Apply the well known antialiasing effect by Nvidia.
+ Use it if you don't want to blur the image and you still don't like
+ jagged or too much pixelated images.
+
+**Scanlines:**
+ Emulate CRT scanlines.
+
+ Scanlines gap brightness:
+ controls how "little" they will look pronunced.
+ You can even use a negative value to make the scanline more evident,
+ but graphical glitches may occour.
+ Scanlines gap brightness:
+ Controls how much the gap between scanlines is dark
+ Compensate brightness loss:
+ Will make scanlines brighter, where possible, to compensate for the loss of brightness
+ gicen by the dark gap between them.
+ Scanlines bleeding:
+ will cause the scanline itself to light the scanline gap (dark) part.
+ You may use it to keep a good brightness overrall picture level.
+ Interlace flicker:
+ Emulates the flickerin issues present on crt interlaced screens
+ where the brighter lines flickers wien they are near dark ones.
+ You can choose to produce the flickering: never, always or only
+ when the input picture is considered interlaced.
+ The threshold for that is defined in config.inc
+ with the parameter: MIN\_LINES\_INTERLACED.
+ Disable on interlaced screen:
+ You can choose to completely disable scanline emulation when
+ the input picture is considered interlaced.
+
+**Input power/glowing:**
+ Emulate the CRT glowing "feature", so that the brighter areas of
+ the image will light their surroundings.
+
+ Input signal glow strength:
+ The input signal gain
+ Sharpness:
+ How much the glow will "spread".
+ When pushed to its maximum value, no blurring will occour.
+ Gamma:
+ Controls how much the signal has to be bright to produce the glow.
+ Post gain:
+ This will cause the glowed image to be added to the input signal.
+ This allows to emulate glow and haloing in a single pass.
+ However the haloing should be applied after the mask emulation.
+ Likely to be removed in a future release.
+
+**RGB Masks and/or Darklines:**
+ Emulates CRT RGB phosphors (RGB Mask),
+ slotmasks and aperturegrille (Darklines).
+
+ (HiDPI) Vmask and Darklines multiplier:
+ This shader is tuned for 1080p, but ff you have an HiDPI display
+ you may want to scale this filter by a factor.
+ Vmask Strength:
+ How much will the RGB mask be visible.
+ RGB Mask: (LoDPI) Green,Magenta -> BGR:
+ By exploiting common monitors RGB subpixel order, this causes
+ the RGB mask, to be emulated by using just 2 pixels instead of 3.
+ Very useful for 1080p (or lower) displays and to keep more brightness.
+ RGB Mask: Horizontal Gap between triads:
+ In real displays rgb triads are separated by a black space.
+ You can emulate it by turning this feature on.
+ RGB Mask: affect bright colors:
+ Emulating RGB masks will lower the resulting image brightness and you
+ just cant push input signal brightness without "burning" the signal.
+ By using this option, the RGB mask will be less evident on brighter
+ colors. However, since this will make the image to look somehow "dull",
+ it is advised to use the "Halo" feature instead (see later).
+ Darklines: strength:
+ How much will the horizontal darklines be visible.
+ Darklines: offset by triads:
+ When drawing "straight" horizontal darklines, you can emulate CRT aperture grille.
+ But if you want slotmasks instead, you need to vertically
+ offset them every RGB triad.
+ Darklines: period (triad height):
+ Basically tells the shader how much a triad has to be high.
+ Darklines: affect bright colors:
+ See "RGB Mask: affect bright colors"
+
+**Halo:**
+ Emulates the effect of the brighter pixels reflected by the CRT glass
+ that lights nearby zones (a sort of tight bloom).
+ The light is meant to be spreaded in a way that it nulls the effect of the
+ dark scanline parts, darklines and the RGB masks.
+ So you can use this to restore the brightness and color saturation
+ loss when using features like scanlines, darklines or RGB masks.
+
+**Bloom:**
+ Acts like Halo, but affects a much wider area and is more configurable.
+ By using this effect and playing with its parameters, you can achieve funny
+ or even artistic results.
+
+ Final mix:
+ Modulates between the original images and the bloomed one.
+ Radius:
+ Controls how much the bloom has to be wide.
+ Quality:
+ How much the shape of the bloomed picture will reflect the original one.
+ Input Gamma:
+ Use this as a threshold to control how much a pixel has to be bright
+ to produce a bloom effect.
+ Power multiplier:
+ Just apply a gain to the final bloom.
+ Output Gamma:
+ Play with it.
+ Strength on bright areas:
+ Since the light produced by the bloom effect is added to the underlying
+ image, it can produce burn effects on the already bright areas.
+ This is actually an hack that will avoid to bloom them.
+ Don't use too low values.
+ Bypass:
+ See how the bloomed image looks alone.
+
+**Curvature:**
+ Emulates a curved CRT display.
+
+ WARP X, WARP Y:
+ control how much the display is curved along its axes.
+ Corner radius, Corner sharpness:
+ Control the "smoothness" of the display corners.
+
+**Bezel:**
+ Draws a monitor frame with simulated reflections from the game content.
+ The monitor frame is an image loaded by the shader and is shipped
+ in the "textures" shader subdirectory, named "monitor\_body.png"
+ It has been made with the following rules that may come handy
+ only if you want to edit it; otherwise go on.
+ - The red channel represents the luminance information
+ - The green channel represents the highlights
+ - The alpha channel in the inner frame represents the part of the bezel
+ that will be filled by the game content
+ - The blue channel represents the part of the bezel that will be filled by the game reflection.
+
+ Bezel color (red,green,blue) and contrast:
+ Allows to choose the color of the monitor frame.
+ Image zoom:
+ Allows to shrink or expand the game content to fit the monitor frame.
+ Frame zoom:
+ Allows to shrink or expand the monitor frame to fit the game content.
+ Image Border:
+ Draws a black border around the game content.
+
+**Backgound image:**
+ Draws an image on screen picked from the "textures" shader subdirectory,
+ named: background.png
+ **-> It is needed that you set retroarch aspect to "Full" <-**
+ ( Settings, Video, Scaling, Aspect Ratio = Full )
+ The image is painted "under" the game content and under the monitor frame by
+ default, and his alpha channel will let you see ambient lighs (see next).
+
+ Image over content (alpha channel driven)?:
+ ...however you can paint the image over the game content and over the
+ monitor frame itself by selecting this option.
+ If you do so, the alpha channel of the background image will be used to
+ let you view the underlying content.
+
+**Ambient light leds:**
+ Emulates the presence of led strips under the monitor that lights the
+ surroundings according to the edges of the game content.
+ -**\> It is needed that you set retroarch aspect to "Full" <-**
+ ( Settings, Video, Scaling, Aspect Ratio = Full )
+
+ Slowness:
+ How much will the leds will take to reflect the game content.
+ It may sound silly to make them slow, but if they reacts too fast,
+ they may distract you.
+ Keep in mynd that there is a scene detection logic that will make them
+ react as fast as possible when a scene change is detected.
+ Light Falloff:
+ How wide is the area illuminated.
+ Led power:
+ Leds post gain.
+ Note: To avoid burn-in effects, keep Light Falloff + Led power < 1.4
+
+
+**Aspect Ratio:**
+ When using effects that need Retroarch aspect ratio option
+ to be set to "full", you have to provide the source aspect
+ ratio to the shader.
+
+ Aspect Ratio Numerator:
+ Setting non positive value here will switch to a predefined
+ aspect ratio from the following list:
+ 0 = 1.33 MAME
+ -1 = 1.55 NTSC
+ -2 = 1.25 PAL
+ -3 = 8/7 Snes
+ -4 = 10/7 Megadrive
+ -5 = Uncorrected
+ Aspect Ratio Denominator:
+ As long as Aspect Ratio Numerator is positive, this will
+ be used as the denominator of the fraction.
+
+**Luminosity dependant zoom:**
+ On older CRT monitors, the picture gets bigger when the image was brighter.
+
+**Vignette:**
+ Will cause uneven brightness of the image, more at the center,
+ less at the edges.
+
+**Spot:**
+ Simulates external light reflected by the monitor glass.
+
+**Alternate line blanking:**
+ CRT monitors \*real\* refresh was amazing, today is just "meh" in most cases.
+ This emmulates the low pixel persistance of CRT monitors
+ and reduces the motion blur, typical of LCD displays, by blanking even/odd
+ screen lines on even/odd frames, by sacrificing image brightness, ofc.
+
+ Frame insertion strength:
+ How much the line will be blanked.
+ Dark lines period:
+ You can blank single line or a group of them at once.
+ See what performs better on your display.
+
diff --git a/bezel/koko-aio/koko-aio.slangp b/bezel/koko-aio/koko-aio.slangp
new file mode 100644
index 0000000..0777602
--- /dev/null
+++ b/bezel/koko-aio/koko-aio.slangp
@@ -0,0 +1,295 @@
+# TODO:
+# Guess more aspect ratios: edit. nope: Guessing is impossible..
+# Update pipeline graph
+
+# Investigate the possible use of mipmapping in bloom function too.
+# Try to move flickering scanlines into main, maybe by faking them with screenlines?
+
+
+# Performances:
+# haswell igp: i5-4590 CPU @ 3.30GHz
+# Output on aspect: full, 1080p, 16:9, 60fps
+# All measurements made with aspect=full, so as long as ambient light is not used, the whole screen is filled by the shader.
+# This means that all the measurements, but ambient light itself are likely higher than real use.
+
+# input: mame, dynamite dux: 26/09/2022 27/10/2022 02/11/2022
+# GPU% Delta% vs Basal:
+# no shader: 11 -23.6 11 10 10
+# basal: 34.6 0.0 31.5 29.5 27.7
+# FXAA: 37.5 2.9 34.15 32.2
+# scanlines: 36.5 1.9 32.3 31.5
+# ...flickering: 36.2 1.6 32.4 32
+#input glow gamma 3: 40 5.4 36.75 35.2
+# rgb mask: 35.7 1.1 32.60 33.4 **
+# slotmask: 36.5 1.9 33.6 32.1
+# halo gamma 3: 40.0 5.4 36.9 35.5
+# bloom(q2): 38 3.4 35.8 35 30.5
+# color corrections: 35 0.4 31.6 29.5
+# curvature warp: 39.2 4.6 33.5 34.1
+# vignette+spot: 35.2 0.6 33.2 34
+# ambient light: 38 3.4 32.1 33.6
+# Bezel: 37.5 33.7
+#-----------------------------------------------
+#Total basal + all the features: 72.2 65.3 65.2 61.2 (bloom q1)
+
+# Koko-aio shader is meant to be an all-in one crt shader.
+# It can be configured with many parameters, so that can be
+# scaled to run on even on modest gpus while still developed to
+# run with heavier presets on at least Haswell+ iGpus.
+# It is not meant to simulate the internal behaviour of CRT displays,
+# but to give users the parameters to make their monitors to look similar.
+# Several presets are included.
+
+# Actually it provides emulation for:
+# scanlines, screenlines, RGB vertical masks, horizontal slot masks,
+# glowing, haloing, blooming, gamma and SATURATION correction,pixel_outi
+# black frame insertions, interlace emulation, antialiasing.
+
+# External code by:
+# * CRT - Guest - Dr.Venom (single pass bloom function)
+# * Nvidia (FXAA)
+
+
+
+
+
+# Bezel texture contains the following infomations:
+# - The red channel represents the luminance information
+# - The green channel represents the highlights
+# - The alpha channel in the inner frame represents the part of the bezel that will be filled by the game content
+# - The blue channel represents the part of the bezel that will be filled by the game reflection.
+
+ textures = "monitor_body;bg_under;bg_over"
+
+ monitor_body = "textures/monitor_body.png"
+ monitor_body_linear = "true"
+ # Does this work?
+ monitor_body_wrap_mode = "clamp_to_edge"
+ monitor_body_mipmap = "true"
+
+ bg_under = "textures/background_under.png"
+ bg_under_linear = "true"
+ bg_under_wrap_mode = "mirrored_repeat"
+ bg_under_mipmap = "true"
+
+ bg_over = "textures/background_over.png"
+ bg_over_linear = "true"
+ bg_over_wrap_mode = "mirrored_repeat"
+ bg_over_mipmap = "true"
+
+shaders = 17
+# For P-uae defaults, doubling just y0 seems the best option.
+# 90% of games are lowres in vertical size and p-uae defaults
+# to 720 pixels width, which is enough for this preset to work as intended.
+# Rest warned, that when a game sets an interlaced resolution, p-uae
+# will output even 560 h-lines which, doubled, will result in
+# 1120 h lines. too much even for a 1080p screen.
+# Auto-Cropping/overscan emulation could be added in a future release.
+# For other emulators/systems, probably it is best and safe to doulbe x0 too.
+
+# In the first pass we draw an optional black border around the image for bezel purposes
+# and scale the image to something better usable by FXAA
+# Scaling y to 2x is needed by flickering scanlines pass.
+
+ shader0 = shaders/first_pass.slang
+ alias0 = "first_pass"
+ filter_linear0 = false
+ scale_type0 = source
+ scale_x0 = 2.0
+ scale_y0 = 2.0
+ wrap_mode0 = "mirrored_repeat"
+float_framebuffer0 = false
+
+# Nvidia fxaa pass:
+# works good for "SD" resolutions
+ shader1 = shaders/fxaa.slang
+ alias1 = "FXAA_pass"
+ filter_linear1 = true
+ scale_type1 = source
+ scale1 = 1.0
+
+# FXAA don't really need any mipmap, but avglum_pass several passes after it does.
+# and for the weird way retroarch manages mipmaps, specify that FXAA_pass wants mipmaps
+# makes first_pass mipmaps available to everyone.
+# even if theoretically not needed, texture() occurrence in FXAA_pass needed to be switched
+# to textureLod(..,0.0) or it acts weird, don't ask me why.
+# yay.
+
+ mipmap_input1 = true
+ wrap_mode1 = "mirrored_repeat"
+float_framebuffer1 = false
+
+
+ shader2 = shaders/shift_and_bleed.slang
+ alias2 = "shift_and_bleed_pass"
+ filter_linear2 = true
+ scale2 = 1.0
+ scale_type2 = source
+float_framebuffer2 = false
+ mipmap_input2 = false
+ wrap_mode2 = "mirrored_repeat"
+
+
+
+# Blur and glow the image as requested
+# This pass aims to simulate the signal input power.
+# Glowing will be used to weighting the scanlines.
+# In this pass we also generate flickering scanlines by blindly blanking
+# alternate lines at #frame interval
+
+ shader3 = shaders/in_glow.slang
+ alias3 = "in_glow_pass"
+ filter_linear3 = true
+ scale3 = 1.0
+ scale_type3 = source
+float_framebuffer3 = true
+ wrap_mode3 = "mirrored_repeat"
+
+
+# This essentially is the same as glowing by a code point of view.
+# But this pass will be added later on instead of mixed
+
+ shader4 = shaders/halo.slang
+ alias4 = "halo_pass"
+ filter_linear4 = true
+ scale4 = 1.0
+ scale_type4 = source
+float_framebuffer4 = true
+ mipmap_input4 = false
+ wrap_mode4 = "mirrored_repeat"
+
+# Get the average luminance needed by ambilight here, because:
+# * mipmap_input only works on "Source" texture
+# * the following pass does not use the previous one
+# * the previous pass represents scene changes.
+
+# The rgb channels of the following pass contains luminance info
+# Used by the bezel code to light up the bezel corners.
+# The alpha channel contains the sum/3.0 of rgb channels
+# used to detect scene changes.
+
+ shader5 = shaders/avglum_pass.slang
+ alias5 = "avglum_pass"
+ filter_linear5 = true
+ scale_type5 = source
+ scale5 = 0.5
+ wrap_mode5 = "mirrored_repeat"
+ mipmap_input5 = false
+
+# The following 2 passes will blur the mirrored part of main pass
+# to emulate bezel reflections.
+
+ shader6 = shaders/reflection_blur_h.slang
+ alias6 = "reflected_blurred_pass1"
+ filter_linear6 = true
+ scale_type6 = source
+ scale6 = 1.0
+ wrap_mode6 = "mirrored_repeat"
+
+ shader7 = shaders/reflection_blur_v.slang
+ alias7 = "reflected_blurred_pass2"
+ filter_linear7 = true
+ scale_type7 = source
+ scale7 = 1.0
+ wrap_mode7 = "mirrored_repeat"
+
+
+# In the subsequent passes we do first a fast bloom by first
+# sampling the original texture and scale it down to keep
+# it fast, next we do subsequent blurd of the bloomed
+# pass.
+
+ shader8 = shaders/bloom_pass_1.slang
+ alias8 = "bloom_pass_1"
+ filter_linear8 = true
+ scale_type8 = source
+ scale8 = 1.0
+# I NEED TO SET **THIS** TO mirrored_repeat TO HAVE THE PREVIOUS PASS mirrored_repeated (!?)
+ wrap_mode8 = "mirrored_repeat"
+ float_framebuffer8 = true
+
+
+ shader9 = shaders/bloom_pass_2.slang
+ alias9 = "bloom_pass_2"
+ filter_linear9 = true
+ scale_type9 = source
+ scale9 = 0.5
+ wrap_mode9 = "clamp_to_edge"
+
+
+ shader10 = shaders/bloom_pass_3.slang
+ alias10 = "bloom_pass_3"
+ filter_linear10 = true
+ scale_type10 = source
+ scale10 = 1.0
+ wrap_mode10 = "clamp_to_edge"
+
+
+ shader11 = shaders/bloom_pass_4.slang
+ alias11 = "bloom_pass_final"
+ filter_linear11 = true
+ scale_type11 = source
+ scale11 = 1.0
+ wrap_mode11 = "mirrored_repeat"
+
+
+# Back led lights:
+# Since the next pass will need mipmaps of the original image, and is only possible to get mipmaps
+ from the very previous pass, the next one will just passthrough the original image
+#
+
+ shader12 = shaders/ambi_push_pass.slang
+ alias12 = "ambi_push_pass"
+# I NEED TO SET **THIS** TO true TO HAVE THE PREVIOUS PASS linearly filtered
+ filter_linear12 = true
+ scale_type12 = source
+ scale12 = 1.0
+ wrap_mode12 = "mirrored_repeat"
+ mipmap_input12 = false
+ float_framebuffer12 = true
+
+# Gather mipmaps from prevous pass and use them to light virtual leds under the virtual monitor
+ shader13 = shaders/ambi_pre_pass.slang
+ alias13 = "ambi_pre_pass1"
+ filter_linear13 = true
+ scale_type13 = source
+ scale13 = 1.0
+ mipmap_input13 = true
+ wrap_mode13 = "clamp_to_border"
+ float_framebuffer13 = false
+
+# Temporally smooth led lights.
+ shader14 = shaders/ambi_temporal_pass.slang
+ alias14 = "ambi_temporal_pass"
+ filter_linear14 = true
+ scale_type14 = source
+ float_framebuffer14 = true
+
+
+# In this pass we gather information about the rotated state of the source
+# This information can only be taken when a pass scales to viewport
+# So use a low output resolution to keep things as light as possible.
+# The feedback of this pass will be queried by previous ones.
+# I tried to move this into final_pass, but the gpu consumption was higher.
+
+ shader15 = shaders/isrotated.slang
+ alias15 = "isrotated_pass"
+ filter_linear15 = true
+ scale15 = 0.1
+ scale_type15 = viewport
+ wrap_mode15 = "mirrored_repeat"
+
+# In this pass we emulate scanlines, glowing,
+# RGB vertical mask, slot mask,haloing and color corrections
+
+# This pass pass will do the composition of the previous passes
+# with the bloomed image, vignette and spot light, black frame insertions
+# and Bezel emulation
+
+ shader16 = shaders/final_pass.slang
+ alias16 = "final_pass"
+ filter_linear16 = true
+ scale_type16 = viewport
+ scale16 = 1.0
+ wrap_mode16 = "mirrored_repeat"
+
diff --git a/bezel/koko-aio/monitor-BASE.slangp b/bezel/koko-aio/monitor-BASE.slangp
new file mode 100644
index 0000000..28e56d7
--- /dev/null
+++ b/bezel/koko-aio/monitor-BASE.slangp
@@ -0,0 +1,238 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+DARKLINES_STRENGTH = "0.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.150000"
+GEOM_WARP_Y = "0.150000"
+GEOM_CORNER_SMOOTH = "200.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/monitor-Commodore_1084S-wider.slangp b/bezel/koko-aio/monitor-Commodore_1084S-wider.slangp
new file mode 100644
index 0000000..3a03df9
--- /dev/null
+++ b/bezel/koko-aio/monitor-Commodore_1084S-wider.slangp
@@ -0,0 +1,257 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+DARKLINES_STRENGTH = "0.700000"
+DARKLINES_PERIOD = "2.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "1.200000"
+GEOM_WARP_Y = "1.000001"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_R = "0.020000"
+BEZEL_G = "0.000000"
+BEZEL_B = "-0.020000"
+BEZEL_CON = "1.280000"
+BEZEL_INNER_ZOOM = "-0.450000"
+BEZEL_FRAME_ZOOM = "-0.190000"
+BEZEL_IMAGE_BORDER = "1.030000"
+DO_BG_IMAGE = "1.000000"
+BG_IMAGE_OVER = "1.000000"
+BG_IMAGE_OFFX = "0.002000"
+BG_IMAGE_OFFY = "0.005000"
+BG_IMAGE_ZOOM = "1.091004"
+DO_AMBILIGHT = "0.000000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.000000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+S_SIZE = "0.640000"
+S_POWER = "0.250000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/monitor-Commodore_1084S.slangp b/bezel/koko-aio/monitor-Commodore_1084S.slangp
new file mode 100644
index 0000000..3af92ef
--- /dev/null
+++ b/bezel/koko-aio/monitor-Commodore_1084S.slangp
@@ -0,0 +1,255 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+DARKLINES_STRENGTH = "0.700000"
+DARKLINES_PERIOD = "2.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "1.400000"
+GEOM_WARP_Y = "1.600000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_R = "0.030000"
+BEZEL_G = "0.000000"
+BEZEL_B = "-0.030000"
+BEZEL_INNER_ZOOM = "-0.590000"
+BEZEL_FRAME_ZOOM = "-0.300000"
+BEZEL_IMAGE_BORDER = "1.040000"
+DO_BG_IMAGE = "1.000000"
+BG_IMAGE_OVER = "1.000000"
+BG_IMAGE_OFFX = "0.001000"
+BG_IMAGE_OFFY = "0.006000"
+DO_AMBILIGHT = "0.000000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.000000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+S_SIZE = "0.640000"
+S_POWER = "0.250000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/monitor-bloom-bezel.slangp b/bezel/koko-aio/monitor-bloom-bezel.slangp
new file mode 100644
index 0000000..ea8462b
--- /dev/null
+++ b/bezel/koko-aio/monitor-bloom-bezel.slangp
@@ -0,0 +1,244 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+DARKLINES_STRENGTH = "0.000000"
+DARKLINES_PERIOD = "2.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.800000"
+GEOM_WARP_Y = "0.850000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.600000"
+AMBI_POWER = "2.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/monitor-bloom-bezelwider.slangp b/bezel/koko-aio/monitor-bloom-bezelwider.slangp
new file mode 100644
index 0000000..c675452
--- /dev/null
+++ b/bezel/koko-aio/monitor-bloom-bezelwider.slangp
@@ -0,0 +1,245 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+DARKLINES_STRENGTH = "0.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.500000"
+GEOM_WARP_Y = "0.500000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_INNER_ZOOM = "-0.005000"
+BEZEL_FRAME_ZOOM = "0.139000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "5.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/monitor-bloom.slangp b/bezel/koko-aio/monitor-bloom.slangp
new file mode 100644
index 0000000..3b014b8
--- /dev/null
+++ b/bezel/koko-aio/monitor-bloom.slangp
@@ -0,0 +1,239 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+DARKLINES_STRENGTH = "0.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.150000"
+GEOM_WARP_Y = "0.150000"
+GEOM_CORNER_SMOOTH = "200.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/monitor-slotmask-bloom-bezel-backimage.slangp b/bezel/koko-aio/monitor-slotmask-bloom-bezel-backimage.slangp
new file mode 100644
index 0000000..e2a45c0
--- /dev/null
+++ b/bezel/koko-aio/monitor-slotmask-bloom-bezel-backimage.slangp
@@ -0,0 +1,246 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+DARKLINES_STRENGTH = "0.700000"
+DARKLINES_PERIOD = "2.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.800000"
+GEOM_WARP_Y = "0.850000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+DO_BG_IMAGE = "1.000000"
+AMBI_STEPS = "5.000000"
+AMBI_FALLOFF = "0.600000"
+AMBI_POWER = "2.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/monitor-slotmask-bloom-bezel.slangp b/bezel/koko-aio/monitor-slotmask-bloom-bezel.slangp
new file mode 100644
index 0000000..c2fa67f
--- /dev/null
+++ b/bezel/koko-aio/monitor-slotmask-bloom-bezel.slangp
@@ -0,0 +1,244 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+DARKLINES_STRENGTH = "0.700000"
+DARKLINES_PERIOD = "2.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.800000"
+GEOM_WARP_Y = "0.850000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.600000"
+AMBI_POWER = "2.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/monitor-slotmask-bloom-bezelwider.slangp b/bezel/koko-aio/monitor-slotmask-bloom-bezelwider.slangp
new file mode 100644
index 0000000..7aad58f
--- /dev/null
+++ b/bezel/koko-aio/monitor-slotmask-bloom-bezelwider.slangp
@@ -0,0 +1,245 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+DARKLINES_STRENGTH = "0.700000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.500000"
+GEOM_WARP_Y = "0.500000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_INNER_ZOOM = "-0.005000"
+BEZEL_FRAME_ZOOM = "0.139000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "5.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/monitor-slotmask-bloom.slangp b/bezel/koko-aio/monitor-slotmask-bloom.slangp
new file mode 100644
index 0000000..a61447f
--- /dev/null
+++ b/bezel/koko-aio/monitor-slotmask-bloom.slangp
@@ -0,0 +1,239 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+DARKLINES_STRENGTH = "0.700000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.150000"
+GEOM_WARP_Y = "0.150000"
+GEOM_CORNER_SMOOTH = "200.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/monitor-slotmask.slangp b/bezel/koko-aio/monitor-slotmask.slangp
new file mode 100644
index 0000000..422f468
--- /dev/null
+++ b/bezel/koko-aio/monitor-slotmask.slangp
@@ -0,0 +1,238 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+GAMMA_OUT = "0.500000"
+DO_SHIFT_RGB = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "7.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+DARKLINES_STRENGTH = "0.700000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINES_BLEEDING = "0.825000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.150000"
+GEOM_WARP_Y = "0.150000"
+GEOM_CORNER_SMOOTH = "200.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/shaders/ambi_pre_pass.slang b/bezel/koko-aio/shaders/ambi_pre_pass.slang
new file mode 100644
index 0000000..9e34e06
--- /dev/null
+++ b/bezel/koko-aio/shaders/ambi_pre_pass.slang
@@ -0,0 +1,129 @@
+#version 450
+
+/* This pass simulates the presence of a led strip placed on the back of the virtual screen */
+
+#include "config.inc"
+
+#define internalness 0.07 //The distance between the screen border and the led strip
+#define leds_per_strip 8 //How many leds per border
+
+#define radius 0.001 //The base radius of the emitted light (tuned by user parameter later)
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 1) out float border_min;
+layout(location = 2) out float border_max;
+layout(location = 3) out float fstep;
+layout(location = 4) out float lod;
+
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+
+ border_min=internalness ;
+ border_max=1.0-internalness ;
+ fstep = (border_max - border_min) / (leds_per_strip-1);
+ //Calc a lod for a texture sized led_strip x led_strip
+ lod = log2(params.SourceSize.y / leds_per_strip);
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 1) in float border_min;
+layout(location = 2) in float border_max;
+layout(location = 3) in float fstep;
+layout(location = 4) in float lod;
+
+layout(location = 0) out vec4 FragColor;
+
+
+layout(set = 0, binding = 2) uniform sampler2D Source;
+layout(set = 0, binding = 3) uniform sampler2D isrotated_passFeedback;
+layout(set = 0, binding = 4) uniform sampler2D ambi_pre_pass1Feedback;
+
+
+#include "includes/functions.include.slang"
+
+vec3 circle_smooth(vec2 coords, vec2 middle, float f_radius, float FALLOFF, float f_lod) {
+ float fdistance=distance(middle, vec2(coords.x, coords.y));
+ float circle = (1-smoothstep(f_radius-FALLOFF, f_radius+FALLOFF, fdistance));
+ vec3 circle_color = textureLod(Source, middle, f_lod).rgb * circle;
+ return circle_color;
+}
+
+#define tol_start 0.06 //skip tolerance
+#define tol_end 0.94 //1-tol_start
+
+
+/*
+ To spare gpu cycles, completely skip the pass
+ by the following factor and return instead the previous
+ (temporal) frame. The trick works because the pass is
+ temporal smoothed later on.
+
+ The only downside is that the leds will have less reaction time.
+ Esample:
+ a FRAME_DIVIDER = 3 over a 60hz content will give
+ a minimum reaction time of 60/3=20Hz=50msecs.
+*/
+
+#define FRAME_DIVIDER 3
+
+void main() {
+ if (DO_AMBILIGHT != 1.0) return;
+
+ if ( mod(params.FrameCount, FRAME_DIVIDER) != 0.0) {
+ FragColor = texture(ambi_pre_pass1Feedback, vTexCoord);
+ return;
+ }
+
+ bool is_rotated = texture(isrotated_passFeedback, vec2(0.5, 0.5)).r > 0.5;
+
+ //Scale to the original aspect
+ vec2 coords = get_scaled_coords(vTexCoord, global.FinalViewportSize, is_rotated);
+ if (DO_BEZEL==1.0) coords = zoomout_coords(coords, -BEZEL_INNER_ZOOM , 1.0);
+
+ //Skip coords in the rect "under the monitor"
+ FragColor = vec4(0.0);
+
+ //First consider to skip the curved coords
+ if (DO_CURVATURE == 1.0) {
+ if ((GEOM_WARP_X > 0.0) || (GEOM_WARP_Y > 0.0)) {
+ vec2 coords_curved = Warp(coords, GEOM_WARP_X, GEOM_WARP_Y);
+ if ( ( (coords_curved.x > tol_start && coords_curved.x < 1.0 - tol_start ) && (coords_curved.y > tol_start && coords_curved.y < 1.0 - tol_start) ) &&
+ !( (coords.x < - tol_start || coords.x > 1.0 + tol_start) || (coords.y < - tol_start || coords.y > 1.0 + tol_start) ) )
+ return;
+ }
+ }
+ //...next, the straight ones (needed even when curvature is due, because it returns particular values in the corners)
+ //skip_pass = skip_pass && !( (coords.x < 0.0 -tol || coords.x > 1.0 +tol) || (coords.y < 0.0 -tol || coords.y > 1.0 +tol) );
+ if (coords.x > tol_start && coords.x < tol_end && coords.y > tol_start && coords.y < tol_end) return;
+
+ //Finally, emulate leds.
+ vec3 pixel_out = vec3(0.0);
+ float middle_x; float middle_y ;
+
+ middle_x=border_min;
+ for (middle_y=border_min ; middle_y <= border_max+eps ; middle_y=middle_y + fstep ) {
+ pixel_out +=circle_smooth(coords, vec2(middle_x,middle_y), radius, AMBI_FALLOFF, lod);
+ }
+ middle_x=border_max;
+ for (middle_y=border_min ; middle_y <= border_max+eps ; middle_y=middle_y + fstep ) {
+ pixel_out +=circle_smooth(coords, vec2(middle_x,middle_y), radius, AMBI_FALLOFF, lod);
+ }
+
+ middle_y=border_min;
+ for (middle_x=border_min+fstep ; middle_x <= border_max-fstep+eps ; middle_x=middle_x + fstep ) {
+ pixel_out +=circle_smooth(coords, vec2(middle_x,middle_y), radius, AMBI_FALLOFF, lod);
+ }
+ middle_y=border_max;
+ for (middle_x=border_min+fstep ; middle_x <= border_max-fstep+eps ; middle_x=middle_x + fstep ) {
+ pixel_out +=circle_smooth(coords, vec2(middle_x,middle_y), radius, AMBI_FALLOFF, lod);
+ }
+
+ FragColor = vec4(pixel_out,1.0);
+ return;
+
+}
diff --git a/bezel/koko-aio/shaders/ambi_push_pass.slang b/bezel/koko-aio/shaders/ambi_push_pass.slang
new file mode 100644
index 0000000..cafd9b6
--- /dev/null
+++ b/bezel/koko-aio/shaders/ambi_push_pass.slang
@@ -0,0 +1,34 @@
+#version 450
+
+/* This pass apply an pre-gain to the leds on the rear of the virtual screen
+ * it is intended to produce a mipmap to be used by the next pass */
+
+
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D first_pass;
+layout(set = 0, binding = 3) uniform sampler2D avglum_pass;
+
+#include "includes/functions.include.slang"
+
+void main() {
+ if (DO_AMBILIGHT != 1.0) return;
+
+ vec3 pixel_out = texture(first_pass, vTexCoord).rgb;
+ pixel_out = apply_fuzzy_main_pass(pixel_out);
+ pixel_out = pixel_push_luminance(pixel_out, AMBI_POWER-1);
+ FragColor = vec4(pixel_out, 1.0);
+}
diff --git a/bezel/koko-aio/shaders/ambi_temporal_pass.slang b/bezel/koko-aio/shaders/ambi_temporal_pass.slang
new file mode 100644
index 0000000..cc29c87
--- /dev/null
+++ b/bezel/koko-aio/shaders/ambi_temporal_pass.slang
@@ -0,0 +1,84 @@
+#version 450
+
+/* In this pass the led light is temporally smoothed to give smooth fades.
+ * the slowness is configurable by user parameter.
+ * It also detect when a full scene is changed to produces fast fades, instead
+ */
+
+#include "config.inc"
+
+#define PreviousSampler ambi_temporal_passFeedback
+#define CurrentSampler ambi_pre_pass1
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D CurrentSampler;
+layout(set = 0, binding = 3) uniform sampler2D PreviousSampler;
+layout(set = 0, binding = 4) uniform sampler2D avglum_pass;
+layout(set = 0, binding = 5) uniform sampler2D avglum_passFeedback;
+
+#define MAX_STEPS AMBI_STEPS
+
+float ambi_step(float start, float end, float mystep) {
+ float diff = start-end;
+ if (abs(diff) < mystep) return end;
+ if (start >= end)
+ return start - mystep;
+ else
+ return start + mystep;
+}
+
+vec3 ambi_step_rgb(vec3 s,vec3 d, vec3 mystep){
+ //step fade (f) rom s to d
+ return vec3 ( ambi_step(s.r,d.r,mystep.r),
+ ambi_step(s.g,d.g,mystep.g),
+ ambi_step(s.b,d.b,mystep.b)
+ );
+}
+
+
+vec4 pixel_ambilight() {
+ vec3 mystep;
+
+ vec4 previous_pixel_vec4 = texture(PreviousSampler, vTexCoord);
+ vec3 current_pixel = texture(CurrentSampler, vTexCoord).rgb;
+ vec3 previous_pixel = previous_pixel_vec4.rgb;
+
+ float scene_change_remaining = previous_pixel_vec4.a;
+
+ float prev_avg_lum = texture(avglum_passFeedback,vec2(0.25,0.25)).a;
+ float curr_avg_lum = texture(avglum_pass ,vec2(0.25,0.25)).a;
+ float diff_avg_lum = abs(prev_avg_lum - curr_avg_lum);
+
+ if (diff_avg_lum >= AMBI_SCENE_CHG_THRSHLD) {
+ scene_change_remaining = 1.0;
+ }
+
+ // Are we changing scene?
+ if (scene_change_remaining > 0.0) {
+ mystep = vec3(max(1.0/MAX_STEPS, AMBI_FAST_STEP)); // <- Never slow down fades due to fast step when changing scene
+ scene_change_remaining -= AMBI_FAST_STEP;
+ } else {
+ mystep = abs((previous_pixel-current_pixel) / MAX_STEPS);
+
+ }
+ return vec4(ambi_step_rgb(previous_pixel,current_pixel,mystep),scene_change_remaining);
+
+}
+
+void main() {
+ if (DO_AMBILIGHT != 1.0) return;
+
+ FragColor = pixel_ambilight();
+}
diff --git a/bezel/koko-aio/shaders/avglum_pass.slang b/bezel/koko-aio/shaders/avglum_pass.slang
new file mode 100644
index 0000000..75fddb9
--- /dev/null
+++ b/bezel/koko-aio/shaders/avglum_pass.slang
@@ -0,0 +1,81 @@
+#version 450
+
+/* In this pass we calculate the average luminance of the scene.
+ * It is cheaply obtained by the use of mipmaps. */
+
+#include "config.inc"
+
+//The mipmap wideness needed by the reflection on the bezel.
+#define min_w 16
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 1) out float lod;
+
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+ lod = log2(params.SourceSize.y / min_w);
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 1) in float lod;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D first_pass;
+layout(set = 0, binding = 3) uniform sampler2D avglum_passFeedback;
+
+/* The following will allow to sample at reduced interval
+ The scene change detection logic will take advantage of it
+ So that quick fades will still be treated as scene changes
+*/
+// #define avglum_divider 4 <-- in config.inc
+
+#include "includes/functions.include.slang"
+
+float get_avg_lum_from_mip() {
+ vec3 mip = textureLod(first_pass, vec2(0.5,0.5),20.0).rgb;
+ mip = apply_fuzzy_main_pass(mip);
+ return (mip.r+mip.g+mip.b)/3.0;
+}
+
+float get_avglum() {
+ bool coordinate_for_scene_detection =
+ vTexCoord.x > 0.24 && vTexCoord.x < 0.26 &&
+ vTexCoord.y > 0.24 && vTexCoord.y < 0.26 ;
+
+ bool reduced_sample_time_is_now = (mod(params.FrameCount,AMBI_AVGLUM_DIVIDER) == 0);
+
+ if (!coordinate_for_scene_detection) return get_avg_lum_from_mip();
+ if (reduced_sample_time_is_now) return get_avg_lum_from_mip();
+ if (coordinate_for_scene_detection && reduced_sample_time_is_now) return get_avg_lum_from_mip();
+
+ /* Implicit else: we are in a coordinate that is not used for scene detection
+ * So just return the feedback of this pass to spare gpu cycles. */
+ return texture(avglum_passFeedback,vTexCoord).a;
+}
+
+void main() {
+ /*Grab a mipmap from the previous pass.
+ Calculate the average luminance from the smallest mipmap and put into the alpha channel
+ So that can be used:
+ 1 - continuously at coordinate 0.5,0.5
+ 2 - sampled less often for scene detection logic at coordinate 0.25,0.25
+ Put another small mipmap into the rgb channel to be used by the reflection code.
+ */
+ //FIXME: see which is faster:
+ //if (DO_AMBILIGHT == 1.0 || DO_BEZEL == 1.0 || DO_DYNZOOM == 1.0) {
+ if ( DO_AMBILIGHT + DO_BEZEL + DO_DYNZOOM + DO_BLOOM == 0 ) return;
+
+ vec4 pixel_out;
+ pixel_out.a = get_avglum();
+ if (DO_BEZEL + DO_BLOOM > 0.0) {
+ //Create a small mipmap to be used to light the bezel corners.
+ pixel_out.rgb = textureLod(first_pass, vTexCoord,lod).rgb;
+ }
+ FragColor = pixel_out;
+
+
+}
diff --git a/bezel/koko-aio/shaders/bloom_pass_1.slang b/bezel/koko-aio/shaders/bloom_pass_1.slang
new file mode 100644
index 0000000..ad87e59
--- /dev/null
+++ b/bezel/koko-aio/shaders/bloom_pass_1.slang
@@ -0,0 +1,43 @@
+#version 450
+
+// This is one of several passes needed to cheaply emulate the bloom effect.
+
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D first_pass;
+
+#include "includes/blooms.include.slang"
+#include "includes/functions.include.slang"
+
+void main() {
+ if (DO_BLOOM == 0.0) return;
+
+ vec3 bloomed = bloom(
+ first_pass,
+ vTexCoord,
+ params.OriginalSize,
+ vec2(BLOOM_SIZE),
+ BLOOM_QUALITY,
+ BLOOM_GAMMA,
+ 0.0,
+ 0.0
+ );
+
+ bloomed = apply_fuzzy_main_pass(bloomed) * BLOOM_POWER;
+ FragColor = vec4(bloomed, 1.0);
+
+}
diff --git a/bezel/koko-aio/shaders/bloom_pass_2.slang b/bezel/koko-aio/shaders/bloom_pass_2.slang
new file mode 100644
index 0000000..d8c563a
--- /dev/null
+++ b/bezel/koko-aio/shaders/bloom_pass_2.slang
@@ -0,0 +1,40 @@
+#version 450
+
+// This is one of several passes needed to cheaply emulate the bloom effect.
+
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D Source;
+
+#include "includes/blooms.include.slang"
+
+void main() {
+ if (DO_BLOOM == 0.0) return;
+
+ vec3 bloomed = bloom(
+ Source,
+ vTexCoord,
+ params.SourceSize,
+ vec2(BLOOM_SIZE),
+ BLOOM_QUALITY,
+ 1.0,
+ 0.196349540625,
+ 0.0
+ );
+
+ FragColor = vec4(bloomed.rgb, 1.0);
+}
diff --git a/bezel/koko-aio/shaders/bloom_pass_3.slang b/bezel/koko-aio/shaders/bloom_pass_3.slang
new file mode 100644
index 0000000..fab94b8
--- /dev/null
+++ b/bezel/koko-aio/shaders/bloom_pass_3.slang
@@ -0,0 +1,41 @@
+#version 450
+
+// This is one of several passes needed to cheaply emulate the bloom effect.
+
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D Source;
+
+#include "includes/blooms.include.slang"
+
+void main() {
+ if (DO_BLOOM == 0.0) return;
+
+ vec3 bloomed = bloom(
+ Source,
+ vTexCoord,
+ params.SourceSize,
+ vec2(BLOOM_SIZE),
+ BLOOM_QUALITY,
+ 1.0,
+ 0.39269908125,
+ 0.0
+ );
+
+ FragColor = vec4(bloomed.rgb, 1.0);
+
+}
diff --git a/bezel/koko-aio/shaders/bloom_pass_4.slang b/bezel/koko-aio/shaders/bloom_pass_4.slang
new file mode 100644
index 0000000..0cd939e
--- /dev/null
+++ b/bezel/koko-aio/shaders/bloom_pass_4.slang
@@ -0,0 +1,41 @@
+#version 450
+
+// This is one of several passes needed to cheaply emulate the bloom effect.
+
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D Source;
+
+#include "includes/blooms.include.slang"
+
+void main() {
+ if (DO_BLOOM == 0.0) return;
+
+ vec3 bloomed = bloom(
+ Source,
+ vTexCoord,
+ params.SourceSize,
+ vec2(BLOOM_SIZE),
+ BLOOM_QUALITY,
+ 1.0,
+ 0.589048621875,
+ 0.0
+ );
+
+ FragColor = vec4(pow(bloomed,vec3(BLOOM_GAMMA_OUT)),1.0);
+
+}
diff --git a/bezel/koko-aio/shaders/config.inc b/bezel/koko-aio/shaders/config.inc
new file mode 100644
index 0000000..1c4c893
--- /dev/null
+++ b/bezel/koko-aio/shaders/config.inc
@@ -0,0 +1,490 @@
+ //Setting the glow/halo sharpness parameter to this
+ //will skip the blurring phase and lowers the gpu use
+ //Set this to the same value as used for the maximum
+ //of IN_GLOW_WH, HALO_W and HALO_H
+#define GLOW_SHARP_MAX 7
+
+ //Consider content interlaced if lines are more than this
+#define MIN_LINES_INTERLACED 300
+
+//Sort of dithering used in vignette, spot, backlight leds
+ #define NOISEPOWER ((params.OutputSize.z)*3)
+
+ //Bezel reflection area size in relation to the game frame
+ //Use the lowest possible value for best performance
+ //It is also used to compute wrap/repeated coordinates.
+#define BEZEL_REFLECTION_AREA_SIZE 0.175
+
+ // 0.0-1.0: sensitivity to scene change (ambilike stuff), 0.0 changes more
+#define AMBI_SCENE_CHG_THRSHLD 0.07
+
+ // The following will allow to sample at reduced interval
+ // The scene change detection logic will take advantage of it
+ // So that quick fades will still be treated as scene changes
+#define AMBI_AVGLUM_DIVIDER 4
+
+ // The following defines the speed of the color fades
+ // when changing scene. (range 0..1)
+ // It is wise to correlate it with avglum_divider
+ // try between (1/avglum_divider) and (1/avglum_divider)/3
+#define AMBI_FAST_STEP 0.125
+
+
+#define eps 1e-5
+
+layout(push_constant) uniform Push {
+ vec4 SourceSize;
+ vec4 OriginalSize;
+ vec4 OutputSize;
+ vec4 final_passSize;
+ uint FrameCount;
+
+ float SCANLINE_DARK;
+ float VMASK_OVERWHITE ;
+ float VMASK_DARKLINE_SCALE;
+ float VMASK_GAP;
+ float VMASK_USE_GM;
+ float DRKLN_OVERWHITE ;
+ float DO_DARKLINES_VOFFSET ;
+ float DARKLINES_PERIOD ;
+ float HALO_W ;
+ float HALO_H ;
+ float HALO_POWER ;
+ float HALO_GAMMA ;
+ float DO_BLOOM ; //4
+ float BLOOM_QUALITY ; //1
+
+} params;
+
+layout(std140, set = 0, binding = 0) uniform UBO {
+ mat4 MVP;
+
+ vec4 FinalViewportSize;
+ vec4 in_glow_passSize;
+ vec4 FXAA_passSize;
+ //vec4 main_passSize;
+ //vec4 monitor_bodySize;
+ //vec4 bgSize;
+ vec4 avglum_passSize;
+ vec4 first_passSize;
+
+ float DO_SCANLINES;
+ float DO_IN_GLOW;
+ float DO_VMASK_AND_DARKLINES ;
+ float MASK_COMPENSATION ;
+ float DO_HALO ;
+ float DO_CCORRECTION;
+ float DO_ALT_BLANK;
+ //float IN_GLOW_ADD ;
+ float SCANLINES_BLEEDING ;
+ float IN_GLOW_WH ;
+ float IN_GLOW_POWER ;
+ float IN_GLOW_GAMMA ;
+ float BLOOM_MIX;
+ float BLOOM_SIZE ; //1
+ float BLOOM_GAMMA; //1
+ float BLOOM_BYPASS; //1
+ float BLOOM_POWER; //1
+ float BLOOM_OVER_WHITE;
+ float BLOOM_GAMMA_OUT;
+ float ALT_BLANK_STRENGTH ; //2 FIXME to 1
+ float ALT_BLANK_PERIOD ;
+ float DO_FXAA ; //1
+ float DO_SAT_BLEED;
+ float SAT_BLEED_SIZE_LEFT;
+ float SAT_BLEED_SIZE_RIGHT;
+ float SAT_BLEED_FALLOFF;
+ float SAT_BLEED_STRENGTH;
+ float SAT_BLEED_PAL;
+ float SCANLINE_FLICKERING ; //2
+ float SCANLINE_FLICKERING_POWER;
+ float SCANLINE_DISABLE_ON_INTERLACE;
+ float SCANLINE_COMPENSATION;
+ float RGB_MASK_STRENGTH;
+ float DARKLINES_STRENGTH;
+ float GAMMA_OUT ; //1
+ float SATURATION;
+ float LUMINANCE;
+ float CONTRAST;
+ float BRIGHTNESS;
+ float TEMPERATURE;
+
+ float DO_CURVATURE;
+
+ float GEOM_WARP_X;
+ float GEOM_WARP_Y;
+ float GEOM_CORNER_SIZE;
+ float GEOM_CORNER_SMOOTH;
+
+ float DO_BEZEL;
+ float BEZEL_R;
+ float BEZEL_G;
+ float BEZEL_B;
+ float BEZEL_CON;
+ float BEZEL_INNER_ZOOM;
+ float BEZEL_IMAGE_BORDER;
+ float BEZEL_FRAME_ZOOM;
+
+ float DO_SPOT;
+ float S_POSITION;
+ float S_SIZE;
+ float S_POWER;
+ float S_BYPASS;
+
+ float DO_VIGNETTE;
+ float V_SIZE;
+ float V_POWER;
+ float V_BYPASS;
+
+ float DO_DYNZOOM;
+ float DYNZOOM_FACTOR;
+
+ float DO_AMBILIGHT;
+ float AMBI_FALLOFF;
+ float AMBI_POWER;
+ float ASPECT_X;
+ float ASPECT_Y;
+ float AMBI_STEPS;
+
+ float DO_BG_IMAGE;
+ float BG_IMAGE_OVER;
+ float BG_IMAGE_OFFY;
+ float BG_IMAGE_OFFX;
+ float BG_IMAGE_ZOOM;
+
+ float DO_SHIFT_RGB;
+ float SHIFT_R;
+ float SHIFT_G;
+ float SHIFT_B;
+ float OFFSET_STRENGTH;
+
+} global;
+
+// Color correction
+#pragma parameter DO_CCORRECTION "★ Color corrections enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter LUMINANCE " Luminance push (>1.0=clip)" 0.0 0.0 1.5 0.05
+#pragma parameter SATURATION " Saturation in (1.0=off)" 1.0 0.0 2.0 0.01
+#pragma parameter CONTRAST " Contrast in (0.0=off)" 0.0 -1.0 1.0 0.01
+#pragma parameter BRIGHTNESS " Brightness in (0.0=off)" 0.0 -1.0 1.0 0.01
+#pragma parameter TEMPERATURE " Temperature in (6500=off)" 6500.0 3000 10000.0 50.0
+#pragma parameter GAMMA_OUT " Gamma out" 0.69 0.1 9.0 0.025
+
+// FXAA
+// Apply an antialiasing filter via FXAA from Nvidia.
+#pragma parameter DO_FXAA "★ FXAA enable? ==>" 0.0 0.0 1.0 1.0
+
+//Offset RGB
+// Allow to shift Red, Green, Blue components along x and y axis
+#pragma parameter DO_SHIFT_RGB "★ Shift RGB components enable? (bad with FXAA) ==>" 0.0 0.0 1.0 1.0
+#pragma parameter OFFSET_STRENGTH " Strength" 0.5 0.0 1.0 0.1
+#pragma parameter SHIFT_R " Red offset" -40.0 -210.0 189.0 1
+#pragma parameter SHIFT_G " Green offset" 40.0 -210.0 189.0 1
+#pragma parameter SHIFT_B " Blue offset" 3.0 -210.0 189.0 1
+
+
+// YIQ/YUV bandwidth limited chroma bleeding.
+#pragma parameter DO_SAT_BLEED "★ Bandwidth limited chroma bleeding enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter SAT_BLEED_PAL " Use PAL colorspace, not NTSC" 0.0 0.0 1.0 1.0
+#pragma parameter SAT_BLEED_STRENGTH " Strength" 1.0 0.0 5.0 0.01
+#pragma parameter SAT_BLEED_SIZE_LEFT " Size Left" 5.0 1.0 40.0 1.0
+#pragma parameter SAT_BLEED_SIZE_RIGHT " Size Right" 5.0 1.0 40.0 1.0
+#pragma parameter SAT_BLEED_FALLOFF " Falloff" 1.7 1.0 2.0 0.01
+
+
+// Input glowing
+// Emulates the glowing of the input signal by blurring it with "IN_GLOW_WH" sharpness.
+// Apply a gamma filter "IN_GLOW_GAMMA" to "light" it, multiplying the result by "IN_GLOW_POWER" and
+// finally interpolating(*) it with the source image.
+// "IN_GLOW_ADD" allows to modulate from interpolation(*) to a sum, wihch may (or not) produce better effects.
+// With "IN_GLOW_ADD=0" input glowing does not alter the RGB mask
+// or slot mask applied to the image.
+#pragma parameter DO_IN_GLOW "★ Glowing Input/power enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter IN_GLOW_POWER " Input signal glow strength" 0.45 0.0 5.0 0.05
+#pragma parameter IN_GLOW_WH " Sharpness" 2.5 0.2 7.0 0.05
+#pragma parameter IN_GLOW_GAMMA " Gamma, the higher, the less the glow on dark colors" 1.0 1.0 10.0 0.1
+//#pragma parameter IN_GLOW_ADD " Post gain (0.0 to disable)" 0.0 0.0 1.0 0.05
+
+
+// RGB Mask
+// Emulates CRT RGB phosphors.
+// This is done by multiplying the source image pixels, in turn, by red green or blue.
+// The strenght of the multiplication, and so of the final effect is affected by "RGB_MASK_STRENGTH" value.
+// A Value of 0 completely disable the effect.
+// "VMASK_DARKLINE_SCALE" Scales the gaps, the width the mask, and the height of the rgm bask and darklines (for HiDPI).
+// "VMASK_GAP" Will draw an horizontal gap between triads, for HiDPI monitors.
+// "VMASK_USE_GM" exploit the rgb subpixel layout of the real monitor to higher the apparent RGB vmask resolution
+// "VMASK_OVERWHITE" modulates the strenght of the effect depending on the source pixel brightness,
+// This is handy if you want to keep a good image contrast/brightness, but keep in mind that other
+// parameters like haloing and bloom.
+
+// Aperture grille/slot mask (shadow mask not implemented) are handled via *DARKLINES*
+// Draw darklines on screen coordinates, by mixing black pixels with the source image
+// on final viewport coordinates.
+// "DARKLINES_STRENGTH" expresses the final strenght of the effect.
+// if "DO_DARKLINES_VOFFSET" is 0, straight horizontal black lines will be painted that emulates an aperture grille.
+// "DARKLINES_PERIOD" expresses every how many lines draw a black one (or the height ov the RGB triads)
+// "DO_DARKLINES_VOFFSET" lets you to vertically offset by ""DARKLINES_PERIOD/2" the lines every 3 screen pixels,
+// allowing, in conjunction with RGB mask, to emulate slot mask
+// MASK_COMPENSATION will, where possible, compensate for the loss of brightness by smartly pushing the source luminance
+
+#pragma parameter DO_VMASK_AND_DARKLINES "★ RGB Masks and/or Darklines enable? ==>" 0.0 0.0 1.0 1.0
+
+#pragma parameter MASK_COMPENSATION " Compensate for brightness loss" 0.0 0.0 1.0 0.05
+
+#pragma parameter VMASK_DARKLINE_SCALE " (HiDPI) Vmask and Darklines multiplier" 1.0 1.0 4.0 1.0
+#pragma parameter RGB_MASK_STRENGTH " Vmask Strength (0.0 to disable)" 0.75 0.0 1.0 0.05
+#pragma parameter VMASK_USE_GM " RGB Mask: (LoDPI) Green,Magenta -> BGR" 0.0 0.0 1.0 1.0
+#pragma parameter VMASK_GAP " RGB Mask: Horizontal Gap between triads" 0.0 0.0 1.0 1.0
+#pragma parameter VMASK_OVERWHITE " RGB Mask: affect bright colors" 1.0 0.0 1.0 0.05
+
+#pragma parameter DARKLINES_STRENGTH " Darklines: strength (0.0 to disable)" 0.65 0.0 1.0 0.05
+#pragma parameter DO_DARKLINES_VOFFSET " Darklines: offset by triads" 1.0 0.0 1.0 1.0
+#pragma parameter DARKLINES_PERIOD " Darklines: period (triad height)" 4.0 2.0 16.0 2.0
+#pragma parameter DRKLN_OVERWHITE " Darklines: affect bright colors" 1.0 0.0 1.0 0.05
+
+
+// Halo
+// The parameters are the same as input glowing, but this time the effect is applie
+// after emulating the RGB phosphors the aperture grille or the slot masks and, instead of
+// multiplying the resulting picture by the source one, it is added.
+// this means that haloing will produce solid colors,
+// lessening afromentioned effects on bright colors.
+#pragma parameter DO_HALO "★ Halo enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter HALO_POWER " Strength" 0.9 0.0 5.0 0.025
+#pragma parameter HALO_W " Horizontal sharpness" 1.75 0.2 7.0 0.05
+#pragma parameter HALO_H " Vertical sharpness" 1.75 0.2 7.0 0.05
+#pragma parameter HALO_GAMMA " Gamma, the higher, the less the halo on dark colors" 2.0 1.0 10.0 0.1
+
+
+// Scanlines
+// Blank even source lines, the value from 0.0 to 1.0 expresses the darkness of the blanked lines
+// 1.0 means no blank at all.
+// SCANLINE_DARK controls the gap brightness
+// SCANLINE_COMPENSATION will make scanlines brighter, where possible, to compensate for the loss of brightness
+// SCANLINE_BLEEDING will make the whiter part of the scanline to bright the gap.
+
+#pragma parameter DO_SCANLINES "★ Scanlines enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter SCANLINE_DARK " Scanlines gap brightness" 0.0 -0.5 1.0 0.05
+#pragma parameter SCANLINE_COMPENSATION " Compensate for brightness loss" 0.0 0.0 1.0 0.1
+#pragma parameter SCANLINES_BLEEDING " Scanlines bleeding" 0.0 0.0 3.0 0.05
+
+// Alternate the drawing of the scanlines between frames. this will produce a flickering typical of
+// interlaced screens; 0 disable the effect, 1 always enables it, 2 enables it only when
+// the shader detects an interlaced signal, which actually means that the vertical resoution is "high enough"
+#pragma parameter SCANLINE_FLICKERING " Interlace Flicker (0=off,1=on,2=if interlaced)" 2.0 0.0 2.0 1.0
+#pragma parameter SCANLINE_FLICKERING_POWER " Interlace Flicker power" 0.75 0.0 4.0 0.1
+
+#pragma parameter SCANLINE_DISABLE_ON_INTERLACE " Disable on interlaced screen" 0.0 0.0 1.0 1.0
+
+
+// Bloom
+// The image is downsampled, bloomed and mixed back with the original image.
+// "BLOOM_MIX" is the final mix strength
+// "BLOOM_SIZE" is the radius of the blurred image
+// "BLOOM_QUALITY" express a tradeoff between quality and effect speed.
+// "BLOOM_GAMMA" allows to apply more bloom on the bright colors of the source image
+// "BLOOM_POWER" is the additional gain applied to the bloom
+// "BLOOM_BYPASS" will show only the bloomed component
+// the original image.
+#pragma parameter DO_BLOOM "★ Bloom enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter BLOOM_MIX " Final mix, (0.0=off)" 0.2 0.0 1.0 0.01
+#pragma parameter BLOOM_SIZE " Radius" 2.0 0.25 30.0 0.25
+#pragma parameter BLOOM_QUALITY " Quality: more is better but slower" 1.0 1.0 32.0 1.0
+#pragma parameter BLOOM_GAMMA " Input Gamma" 10.0 1.0 10.0 0.1
+#pragma parameter BLOOM_POWER " Power multiplier" 10.0 1.0 100.0 0.5
+#pragma parameter BLOOM_GAMMA_OUT " Output Gamma" 10.0 0.1 10.0 0.1
+#pragma parameter BLOOM_OVER_WHITE " Strength on bright areas (0 = aura)" 0.5 0.0 1.0 0.05
+#pragma parameter BLOOM_BYPASS " Bypass" 0.0 0.0 1.0 1.0
+
+//Curvature parameters:
+#pragma parameter DO_CURVATURE "★ Curvature enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter GEOM_WARP_X " Warp X" 0.3 0.0 6.0 0.05
+#pragma parameter GEOM_WARP_Y " Warp Y" 0.0 0.0 6.0 0.05
+#pragma parameter GEOM_CORNER_SIZE " Corner radius" 0.01 0.01 0.1 0.005
+#pragma parameter GEOM_CORNER_SMOOTH " Corner sharpness" 350.0 50.0 1000.0 25.0
+
+//Bezel related
+#pragma parameter DO_BEZEL "★ Bezel enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter BEZEL_R " Bezel color: Red" -0.3 -0.5 0.5 0.01
+#pragma parameter BEZEL_G " Bezel color: Green" -0.3 -0.5 0.5 0.01
+#pragma parameter BEZEL_B " Bezel color: Blue" -0.3 -0.5 0.5 0.01
+#pragma parameter BEZEL_CON " Bezel Contrast" 1.3 0.0 10.0 0.01
+#pragma parameter BEZEL_INNER_ZOOM " Image zoom" -0.18 -1.5 0.5 0.01
+#pragma parameter BEZEL_FRAME_ZOOM " Frame zoom" 0.0 -1.5 0.5 0.01
+#pragma parameter BEZEL_IMAGE_BORDER " Image border" 1.01 1.0 1.2 0.01
+
+#pragma parameter DO_BG_IMAGE "★ Backgound image enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter LABEL_WARNING1 " âš RetroArch aspect needs to be set to Full! âš " 1.0 1.0 1.0 1.0
+#pragma parameter BG_IMAGE_OVER " Image over content (alpha channel driven)?" 0.0 0.0 1.0 1.0
+#pragma parameter BG_IMAGE_OFFX " Shift Image over X axis" 0.0 -1.0 1.0 0.001
+#pragma parameter BG_IMAGE_OFFY " Shift Image over Y axis" 0.0 -1.0 1.0 0.001
+#pragma parameter BG_IMAGE_ZOOM " Zoom Image" 1.0 -1.0 3.0 0.001
+
+
+//Back leds
+//Emulates leds under the monitor frame that slowly reacts to image contents
+#pragma parameter DO_AMBILIGHT "★ Ambient light leds enable? ==> " 1.0 0.0 1.0 1.0
+#pragma parameter LABEL_WARNING3 " âš RetroArch aspect needs to be set to Full! âš " 1.0 1.0 1.0 1.0
+#pragma parameter LABEL_WARNING4 " âš Resize the window once if you see glitches! âš " 1.0 1.0 1.0 1.0
+#pragma parameter AMBI_STEPS " Slowness" 60.0 5.0 1000.0 5.0
+#pragma parameter AMBI_FALLOFF " Light Falloff" 0.7 0.1 3.0 0.01
+#pragma parameter AMBI_POWER " Led power" 1.5 1.0 7.0 0.05
+
+
+#pragma parameter label_ar "★ Aspect Ratio " 0.0 0.0 1.0 1.0
+#pragma parameter ASPECT_X " Aspect Ratio Numerator (-x for a preset below)" 0.0 -5.0 256. 1.0
+#pragma parameter ASPECT_Y " Aspect Ratio Denominator" 3.0 0.0 256. 1.0
+#pragma parameter label_aspect_presets " Presets reference list:" 0.0 0.0 0.0 1.0
+#pragma parameter label_aspect_preset0 " (0 = MAME 1.33)" 0.0 0.0 0.0 1.0
+#pragma parameter label_aspect_preset1 " (-1 = NTSC 1.5)" 0.0 0.0 0.0 1.0
+#pragma parameter label_aspect_preset2 " (-2 = PAL 1.25)" 0.0 0.0 0.0 1.0
+#pragma parameter label_aspect_preset3 " (-3 = Snes 8/7)" 0.0 0.0 0.0 1.0
+#pragma parameter label_aspect_preset4 " (-4 = Megadrive 10/7)" 0.0 0.0 0.0 1.0
+#pragma parameter label_aspect_preset5 " (-5 = Uncorrected)" 0.0 0.0 0.0 1.0
+
+//Full screen glowing
+//Modulate the image zooming depending on the image luminosity.
+//You can lower the effect power through the DYNZOOM_FACTOR parameter.
+#pragma parameter DO_DYNZOOM "★ Luminosity dependant zoom enable? ==>" 1.0 0.0 1.0 1.0
+#pragma parameter DYNZOOM_FACTOR " Narrowness" 80.0 30.0 120.0 1.0
+
+
+//Vignette and spot
+//Emulates the vignette effect and/or a light reflection.
+#pragma parameter DO_VIGNETTE "★ Vignette enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter V_BYPASS " bypass " 0.0 0.0 1.0 1.0
+#pragma parameter V_SIZE " size" 1.7 0.0 3.0 0.05
+#pragma parameter V_POWER " power" 1.1 0.05 2.0 0.05
+
+#pragma parameter DO_SPOT "★ Spot enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter S_BYPASS " bypass" 0.0 0.0 1.0 1.0
+#pragma parameter S_POSITION " Position" 0.0 -420.0 378.0 1
+#pragma parameter S_SIZE " size" 0.4 0.0 1.0 0.01
+#pragma parameter S_POWER " power" 0.1 0.05 2.0 0.05
+
+
+// Alternative blanking.
+// Emulates the low pixel persistance of CRT monitors and reduces the motion blur,
+// typical of LCD displays, by blanking even/odd screen lines on even/odd frames.
+// ALT_BLANK_STRENGTH expresses the strength of the "blank".
+#pragma parameter DO_ALT_BLANK "★ Alternate line blanking enable? ==>" 0.0 0.0 1.0 1.0
+#pragma parameter ALT_BLANK_STRENGTH " Alternate black frame insertion strength" 0.5 0.0 1.0 0.1
+#pragma parameter ALT_BLANK_PERIOD " Dark lines period" 4.0 0.0 20.0 1.0
+
+
+#define DO_FXAA global.DO_FXAA
+
+#define DO_SAT_BLEED global.DO_SAT_BLEED
+#define SAT_BLEED_SIZE_LEFT global.SAT_BLEED_SIZE_LEFT
+#define SAT_BLEED_SIZE_RIGHT global.SAT_BLEED_SIZE_RIGHT
+#define SAT_BLEED_FALLOFF global.SAT_BLEED_FALLOFF
+#define SAT_BLEED_STRENGTH global.SAT_BLEED_STRENGTH
+#define SAT_BLEED_PAL global.SAT_BLEED_PAL
+//#define prefer_std_pow params.prefer_std_pow
+
+#define DO_SCANLINES global.DO_SCANLINES
+#define SCANLINE_DARK params.SCANLINE_DARK
+#define SCANLINE_OVERWHITE global.SCANLINE_OVERWHITE
+#define SCANLINE_FLICKERING global.SCANLINE_FLICKERING
+#define SCANLINE_FLICKERING_POWER global.SCANLINE_FLICKERING_POWER
+#define SCANLINE_DISABLE_ON_INTERLACE global.SCANLINE_DISABLE_ON_INTERLACE
+#define SCANLINE_COMPENSATION global.SCANLINE_COMPENSATION
+
+#define DO_IN_GLOW global.DO_IN_GLOW
+//#define IN_GLOW_ADD global.IN_GLOW_ADD
+#define SCANLINES_BLEEDING global.SCANLINES_BLEEDING
+#define IN_GLOW_WH global.IN_GLOW_WH
+#define IN_GLOW_POWER global.IN_GLOW_POWER
+#define IN_GLOW_GAMMA global.IN_GLOW_GAMMA
+
+#define DO_VMASK_AND_DARKLINES global.DO_VMASK_AND_DARKLINES
+#define MASK_COMPENSATION global.MASK_COMPENSATION
+#define RGB_MASK_STRENGTH global.RGB_MASK_STRENGTH
+#define VMASK_OVERWHITE params.VMASK_OVERWHITE
+#define VMASK_DARKLINE_SCALE params.VMASK_DARKLINE_SCALE
+#define VMASK_GAP params.VMASK_GAP
+#define VMASK_USE_GM params.VMASK_USE_GM
+
+#define DARKLINES_STRENGTH global.DARKLINES_STRENGTH
+#define DRKLN_OVERWHITE params.DRKLN_OVERWHITE
+#define DO_DARKLINES_VOFFSET params.DO_DARKLINES_VOFFSET
+#define DARKLINES_PERIOD params.DARKLINES_PERIOD
+
+#define DO_HALO global.DO_HALO
+#define HALO_W params.HALO_W
+#define HALO_H params.HALO_H
+#define HALO_POWER params.HALO_POWER
+#define HALO_GAMMA params.HALO_GAMMA
+
+#define DO_BLOOM params.DO_BLOOM
+#define BLOOM_MIX global.BLOOM_MIX
+#define BLOOM_QUALITY params.BLOOM_QUALITY
+#define BLOOM_SIZE global.BLOOM_SIZE
+#define BLOOM_GAMMA global.BLOOM_GAMMA
+#define BLOOM_POWER global.BLOOM_POWER
+#define BLOOM_GAMMA_OUT global.BLOOM_GAMMA_OUT
+#define BLOOM_OVER_WHITE global.BLOOM_OVER_WHITE
+#define BLOOM_BYPASS global.BLOOM_BYPASS
+
+
+#define DO_CCORRECTION global.DO_CCORRECTION
+#define GAMMA_OUT global.GAMMA_OUT
+#define SATURATION global.SATURATION
+#define LUMINANCE global.LUMINANCE
+#define CONTRAST global.CONTRAST
+#define BRIGHTNESS global.BRIGHTNESS
+#define TEMPERATURE global.TEMPERATURE
+
+#define DO_ALT_BLANK global.DO_ALT_BLANK
+#define ALT_BLANK_STRENGTH global.ALT_BLANK_STRENGTH
+#define ALT_BLANK_PERIOD global.ALT_BLANK_PERIOD
+
+
+#define DO_CURVATURE global.DO_CURVATURE
+#define GEOM_WARP_X global.GEOM_WARP_X
+#define GEOM_WARP_Y global.GEOM_WARP_Y
+#define GEOM_CORNER_SIZE global.GEOM_CORNER_SIZE
+#define GEOM_CORNER_SMOOTH global.GEOM_CORNER_SMOOTH
+
+
+#define DO_BEZEL global.DO_BEZEL
+#define BEZEL_R global.BEZEL_R
+#define BEZEL_G global.BEZEL_G
+#define BEZEL_B global.BEZEL_B
+#define BEZEL_CON global.BEZEL_CON
+#define BEZEL_INNER_ZOOM global.BEZEL_INNER_ZOOM
+#define BEZEL_FRAME_ZOOM global.BEZEL_FRAME_ZOOM
+#define BEZEL_IMAGE_BORDER global.BEZEL_IMAGE_BORDER
+
+#define DO_SPOT global.DO_SPOT
+#define S_BYPASS global.S_BYPASS
+#define S_POSITION global.S_POSITION
+#define S_SIZE global.S_SIZE
+#define S_POWER global.S_POWER
+
+#define DO_DYNZOOM global.DO_DYNZOOM
+#define DYNZOOM_FACTOR global.DYNZOOM_FACTOR
+
+#define DO_VIGNETTE global.DO_VIGNETTE
+#define V_BYPASS global.V_BYPASS
+#define V_SIZE global.V_SIZE
+#define V_POWER global.V_POWER
+
+#define DO_AMBILIGHT global.DO_AMBILIGHT
+#define AMBI_STEPS global.AMBI_STEPS
+#define AMBI_FALLOFF global.AMBI_FALLOFF
+#define AMBI_POWER global.AMBI_POWER
+#define ASPECT_X global.ASPECT_X
+#define ASPECT_Y global.ASPECT_Y
+
+#define DO_BG_IMAGE global.DO_BG_IMAGE
+#define BG_IMAGE_OVER global.BG_IMAGE_OVER
+#define BG_IMAGE_OFFY global.BG_IMAGE_OFFY
+#define BG_IMAGE_OFFX global.BG_IMAGE_OFFX
+#define BG_IMAGE_ZOOM global.BG_IMAGE_ZOOM
+
+#define DO_SHIFT_RGB global.DO_SHIFT_RGB
+#define SHIFT_R global.SHIFT_R
+#define SHIFT_G global.SHIFT_G
+#define SHIFT_B global.SHIFT_B
+#define OFFSET_STRENGTH global.OFFSET_STRENGTH
diff --git a/bezel/koko-aio/shaders/final_pass.slang b/bezel/koko-aio/shaders/final_pass.slang
new file mode 100644
index 0000000..07131aa
--- /dev/null
+++ b/bezel/koko-aio/shaders/final_pass.slang
@@ -0,0 +1,556 @@
+#version 450
+
+/* This pass:
+ * Composes the previous passes
+ * Does masks, spot, bezel, vignette, background image (anything else?)
+ */
+
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+
+
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 1) out vec2 vOutputCoord;
+layout(location = 2) out vec2 spot_offset;
+layout(location = 3) out vec2 vFragCoord;
+
+#include "includes/functions.include.slang"
+
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = get_scaled_coords(TexCoord,global.FinalViewportSize, is_rotated())+vec2(0.00001);
+ vOutputCoord = TexCoord;
+
+ spot_offset = offsets_from_float(S_POSITION+420.0,40);
+ spot_offset = spot_offset / 10.0 + vec2(0.0,1.0);
+
+ vFragCoord = vec2( floor(vOutputCoord.x * params.OutputSize.x),
+ floor(vOutputCoord.y * params.OutputSize.y));
+}
+
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 1) in vec2 vOutputCoord;
+layout(location = 2) in vec2 spot_offset;
+layout(location = 3) in vec2 vFragCoord;
+
+layout(location = 0) out vec4 FragColor;
+
+
+layout(set = 0, binding = 2) uniform sampler2D bloom_pass_final;
+layout(set = 0, binding = 3) uniform sampler2D reflected_blurred_pass2;
+layout(set = 0, binding = 4) uniform sampler2D ambi_temporal_pass;
+layout(set = 0, binding = 5) uniform sampler2D avglum_pass;
+layout(set = 0, binding = 6) uniform sampler2D monitor_body;
+layout(set = 0, binding = 7) uniform sampler2D bg_under;
+layout(set = 0, binding = 8) uniform sampler2D bg_over;
+layout(set = 0, binding = 9) uniform sampler2D first_pass;
+layout(set = 0, binding = 10) uniform sampler2D shift_and_bleed_pass;
+
+//Ex main_pass layouts:
+ layout(set = 0, binding = 11) uniform sampler2D FXAA_pass;
+ layout(set = 0, binding = 12) uniform sampler2D in_glow_pass;
+ layout(set = 0, binding = 13) uniform sampler2D halo_pass;
+ layout(set = 0, binding = 14) uniform sampler2D avglum_passFeedback;
+
+//Ex main_pass defines:
+ #define half_pi 1.5707963267949
+
+#include "includes/functions.include.slang"
+
+vec3 pixel_vmask(vec3 source, vec3 white_reference, float over_white) {
+// Simple RGB mask emulation with or without horizontal gap
+ float ooo = 1.0 - RGB_MASK_STRENGTH;
+
+ // RGB mask: R G B
+ vec3 m1 = vec3( 1.0 , ooo , ooo ); //col 1
+ vec3 m2 = vec3( ooo , 1.0 , ooo ); //col 2
+ vec3 m3 = vec3( ooo , ooo , 1.0 ); //col 3
+ vec3 gap = vec3( ooo );
+
+ int col = int( vOutputCoord.x * params.OutputSize.x );
+ vec3 pixel_out;
+ vec3 vmasked;
+ vec4 vec_mod=(vec4(3,1,2,3) + vec4(VMASK_GAP,0.0,0.0,0.0))* VMASK_DARKLINE_SCALE ;
+
+ if (mod(col, vec_mod.x) < vec_mod.y)
+ vmasked = m1 * source;
+ else if (mod(col, vec_mod.x) < vec_mod.z)
+ vmasked = m2 * source;
+ else if (mod(col, vec_mod.x) < vec_mod.w)
+ vmasked = m3 * source;
+ else vmasked = gap * source;
+
+ if (over_white == 1.0) pixel_out = vmasked;
+ else {
+ float whiteness=max(max(white_reference.r,white_reference.g),white_reference.b);
+ whiteness-= over_white;
+ whiteness= clamp(whiteness,0.0,1.0);
+ pixel_out= mix(vmasked,source,whiteness);
+ }
+ return pixel_out;
+
+}
+
+
+vec3 pixel_vmask_gm(vec3 source, vec3 white_reference, float over_white) {
+// Simple RGB mask emulation with or without horizontal gap
+ float ooo = 1.0 - RGB_MASK_STRENGTH;
+
+ // RGB mask: R G B
+ vec3 m1 = vec3( ooo , 1.0 , ooo ); //col 1
+ vec3 m2 = vec3( 1.0 , ooo , 1.0 ); //col 2
+ vec3 gap = vec3( ooo );
+
+ int col = int( vOutputCoord.x * params.OutputSize.x );
+ vec3 pixel_out;
+ vec3 vmasked;
+ vec3 vec_mod=(vec3(2,1,2) + vec3(VMASK_GAP,0.0,0.0))* VMASK_DARKLINE_SCALE ;
+
+ if (mod(col, vec_mod.x) < vec_mod.y)
+ vmasked = m1 * source;
+ else if (mod(col, vec_mod.x) < vec_mod.z)
+ vmasked = m2 * source;
+ else
+ vmasked = gap * source;
+
+ if (over_white == 1.0) pixel_out = vmasked;
+ else {
+ float whiteness=max(max(white_reference.r,white_reference.g),white_reference.b);
+ whiteness-= over_white;
+ whiteness= clamp(whiteness,0.0,1.0);
+ pixel_out= mix(vmasked,source,whiteness);
+ }
+
+ return pixel_out;
+}
+
+vec3 pixel_darklines(vec3 source,float darkline_every, float darkline_trans,
+ float do_offset, vec3 white_reference,float over_white) {
+/* "darklines" are vertical gaps that can be used to emulate aperturegrille
+ * or slotmasks
+ */
+
+ float Darkline_part_w = (3.0 - VMASK_USE_GM + VMASK_GAP) * VMASK_DARKLINE_SCALE;
+ float Darkline_part_w_x2 = Darkline_part_w*2;
+
+ darkline_every *= VMASK_DARKLINE_SCALE;
+
+ if (over_white != 1.0) {
+ //less effect on bright colors.
+ float whiteness=max(max(white_reference.r,white_reference.g),white_reference.b);
+ darkline_trans+=(whiteness-over_white);
+ darkline_trans=clamp(darkline_trans,0.0,1.0);
+ }
+
+ //Slotmask (darklines are drawn with offset)
+ if (do_offset == 1.0) {
+ bool odd_line_meno_densa = mod(vFragCoord.y, darkline_every) > VMASK_DARKLINE_SCALE ;
+ bool odd_line_piu_densa = !(mod(vFragCoord.y, darkline_every/2) < VMASK_DARKLINE_SCALE && odd_line_meno_densa);
+ bool odd_column = mod(vFragCoord.x + Darkline_part_w , Darkline_part_w_x2) < Darkline_part_w;
+ bool draw_mask = odd_line_piu_densa && !odd_column || odd_column && odd_line_meno_densa;
+ return source * clamp(float(draw_mask),darkline_trans,1.0);
+ }
+
+ //Aperture grille (darklines are drawn straight)
+ bool draw_dark = mod(vFragCoord.y, darkline_every) < VMASK_DARKLINE_SCALE;
+ bool draw_color = !draw_dark;
+ return source * ( float(draw_color) + float(draw_dark) * darkline_trans );
+}
+
+float scanline_shape(vec2 coords, bool do_flicker) {
+/* Produces a B/W scanline shape to be multiplicated by the source
+ * pixel later on to emulate scanline effect.
+ * scanlines can be drawn on odd and even fields alternating on odd and
+ * even frames to emulate that aspect of interlacing.
+ */
+
+ bool alternate = false;
+ float period = 1.0;
+
+ if (do_flicker) {
+ if (params.FrameCount % 2 == 0.0) alternate = true;
+ if (params.OriginalSize.y > MIN_LINES_INTERLACED ) period = 0.5;
+ }
+
+ float angle = coords.y * pi * params.OriginalSize.y * period;
+
+ float lines;
+ if (alternate)
+ lines = -sin(angle+half_pi); //lines = abs(cos(angle));
+ else
+ lines = sin(angle);
+ lines = (lines*lines);
+
+ if (SCANLINE_DARK >= 0.0) {
+ lines = lines * (1.0 - SCANLINE_DARK) + SCANLINE_DARK;
+ } else {
+ float deepness = -SCANLINE_DARK;
+ lines = lines * ((1-SCANLINE_DARK) ) + SCANLINE_DARK ;
+ }
+
+ return lines;
+}
+
+vec4 pixel_main_pass(vec2 coords, bool bBorder_needed) {
+ //Exit if we don't need a border (ambient light/background picture)
+ //And we are outside the the border (unsure if this double check is good for performance) //FIXME
+ if (bBorder_needed)
+ if (vTexCoord.x < 0.0 || vTexCoord.x > 1.0 || vTexCoord.y < 0.0 || vTexCoord.y > 1.0) return vec4(0.0);
+
+ bool isinterlaced = is_interlaced();
+ bool flickering_scanlines = (DO_SCANLINES == 1.0) && scanline_have_to_flicker(isinterlaced) ;
+
+ vec3 pixel_in;
+ vec3 pixel_glowed;
+
+ //Get the first available pixel_in:
+ if (DO_IN_GLOW == 1.0) {
+ pixel_glowed = texture(in_glow_pass,coords).rgb;
+ pixel_in = pixel_glowed; }
+ else if ( DO_SHIFT_RGB + DO_SAT_BLEED > 0.0)
+ pixel_in = texture(shift_and_bleed_pass,coords).rgb ;
+ else if (DO_FXAA > 0.0)
+ pixel_in = texture(FXAA_pass,coords).rgb ;
+ else
+ pixel_in = texture(first_pass,coords).rgb ;
+
+
+ vec3 pixel_out = pixel_in;
+ vec3 pixel_in_clamped = min(pixel_in,vec3(1.0)); //Clamp here for both vmask and darklines.
+
+ //Mask and darklines:
+ if (DO_VMASK_AND_DARKLINES == 1.0 ) {
+ vec3 pixel_in_compensated = pixel_in;
+
+ pixel_in_compensated = pixel_push_luminance(pixel_in, RGB_MASK_STRENGTH * MASK_COMPENSATION);
+
+ if (RGB_MASK_STRENGTH > 0.0) {
+ //Use RGB pattern or exploit RGB layout with green and magenta?
+ if (VMASK_USE_GM < 1.0)
+ pixel_out = pixel_vmask(pixel_in_compensated, pixel_in_clamped, VMASK_OVERWHITE);
+ else
+ pixel_out = pixel_vmask_gm(pixel_in_compensated, pixel_in_clamped, VMASK_OVERWHITE);
+ }
+
+ pixel_out = pixel_push_luminance(pixel_out, DARKLINES_STRENGTH * (1.0/DARKLINES_PERIOD) * MASK_COMPENSATION);
+
+ //Screen lines (slotmask aperture grille)
+ if (DARKLINES_STRENGTH > 0.0 ) {
+ float MYDARKLINES_TRANSPARENCY = 1.0 - DARKLINES_STRENGTH;
+ pixel_out = pixel_darklines(pixel_out,DARKLINES_PERIOD,MYDARKLINES_TRANSPARENCY,DO_DARKLINES_VOFFSET,pixel_in_clamped,DRKLN_OVERWHITE);
+ }
+
+ }
+
+ //Halo
+ vec3 pixel_haloed;
+ if (DO_HALO == 1.0 ) {
+ pixel_haloed = texture(halo_pass,coords).rgb;
+ pixel_out += pixel_haloed;
+ }
+
+ /* Non flickering scanlines, Don't do them if
+ * - User doesn't want scanlines
+ * - The screen is interlaced and the user doesn't want scanlines on it.
+ */
+ if ( DO_SCANLINES == 1.0 &&
+ !( isinterlaced && SCANLINE_DISABLE_ON_INTERLACE == 1.0 )
+ ) {
+ /* pixel_bleed is the color that will bleed over scanline gap.
+ * It is selected by the first available one depending on the shader
+ * features enabled by the user */
+ vec3 pixel_bleed;
+ if (DO_HALO == 1.0)
+ pixel_bleed = pixel_haloed;
+ else if (DO_IN_GLOW == 1.0)
+ pixel_bleed = pixel_glowed;
+ else
+ pixel_bleed = pixel_in;
+
+ // Optionally apply a gamma correction to the scanline shape.
+ if (SCANLINE_COMPENSATION > 0.0) {
+ float mypow = mix(1.0, (0.33 * SCANLINE_DARK + 0.67), SCANLINE_COMPENSATION);
+ pixel_out = pow(pixel_out,vec3(mypow));
+ }
+
+ float scanline_shape = scanline_shape(coords, flickering_scanlines);
+ //Obtain the scanlines screen by multiplying the scanline shape by the pixel color.
+ vec3 pixel_scanlined = pixel_out * scanline_shape;
+ //Next, emulate the bleeding of the color over the dark part of the scanlined screen.
+ pixel_out = pixel_scanlined + (pixel_out * pixel_bleed * SCANLINES_BLEEDING * (1-scanline_shape));
+ }
+
+ // Apply color correction (in this pass it is just the final output gamma)
+ if (DO_CCORRECTION == 1.0) pixel_out = pow(pixel_out,vec3(GAMMA_OUT));
+
+ //Out
+ return vec4(pixel_out,1.0) ; //* border(border_coords);
+}
+
+float global_noise;
+
+
+vec4 pixel_background_image(bool over){
+ //return the aspect corrected background image:
+ vec2 bg_image_offset=vec2(BG_IMAGE_OFFX,BG_IMAGE_OFFY);
+ if (over) {
+ vec2 tex_size = textureSize(bg_over, 0); // * BG_ZOOM;
+ float bg_over_lod = log2(tex_size.y / global.FinalViewportSize.y);
+ vec2 back_coords = get_scaled_coords_aspect(vOutputCoord+bg_image_offset,global.FinalViewportSize, tex_size.x/tex_size.y, is_rotated());
+ back_coords=zoom(back_coords, BG_IMAGE_ZOOM);
+ return textureLod(bg_over,back_coords,bg_over_lod);
+ }
+ //under
+ vec2 tex_size = textureSize(bg_under, 0); // * BG_ZOOM;
+ float bg_under_lod = log2(tex_size.y / global.FinalViewportSize.y);
+ vec2 back_coords = get_scaled_coords_aspect(vOutputCoord+bg_image_offset,global.FinalViewportSize, tex_size.x/tex_size.y, is_rotated());
+ back_coords=zoom(back_coords, BG_IMAGE_ZOOM);
+ return textureLod(bg_under,back_coords,bg_under_lod);
+}
+
+vec3 pixel_border(bool image_over) {
+ /* Returns the surrounding of the tube/bezel:
+ * The led light alone
+ * the led light "under" a background image (alpha driven)
+ */
+ vec3 pixel_out = vec3(1.0);
+ if (DO_AMBILIGHT == 1.0)
+ pixel_out = texture(ambi_temporal_pass, vOutputCoord + global_noise ).rgb;
+ if (DO_BG_IMAGE == 1.0 && !image_over) {
+ vec4 bg_image = pixel_background_image(false);
+ pixel_out = mix(pixel_out,bg_image.rgb,bg_image.a);
+ }
+ return pixel_out;
+}
+
+
+vec3 pixel_alternate(vec3 source, float whiteness) {
+ // Emulate the low crt persistance by only drawing odd/even lines
+ // on odd/even frames
+ float line = vTexCoord.y * params.OutputSize.y;
+ vec3 pixel_out = source;
+ float l_period_half = ALT_BLANK_PERIOD / 2;
+ if (mod(float(params.FrameCount),2.0 ) == 1) {
+ if (mod(line,ALT_BLANK_PERIOD) > l_period_half) pixel_out=mix(source,vec3(0), whiteness) ;
+ } else {
+ if (mod(line,ALT_BLANK_PERIOD) <= l_period_half) pixel_out=mix(source,vec3(0), whiteness) ;
+ }
+ return pixel_out;
+}
+
+
+#define bezel_luminance bezel.r
+vec3 bezel_color(float lum) {
+ //Colorize bezel frame
+ vec3 col = vec3(BEZEL_R,BEZEL_G,BEZEL_B) + lum;
+ float con_max = 0.5 * BEZEL_CON + 0.5;
+
+ col.r = scale_to_range(col.r, -con_max+1, con_max); //contrast
+ col.g = scale_to_range(col.g, -con_max+1, con_max); //contrast
+ col.b = scale_to_range(col.b, -con_max+1, con_max); //contrast
+ return clamp(col,0.0,1.0);
+}
+
+vec3 compose_bezel_over(vec3 full_viewport) {
+ vec2 bezel_lut_size = textureSize(monitor_body,0);
+ float bezel_frame_lod = log2(bezel_lut_size.y * (BEZEL_FRAME_ZOOM+1.0) /global.FinalViewportSize.y);
+ vec2 coords_for_bezel = vTexCoord;
+
+ if (BEZEL_FRAME_ZOOM != 0.0)
+ coords_for_bezel = zoomout_coords(vTexCoord,-BEZEL_FRAME_ZOOM,1.0);
+
+ vec2 coords_for_mirror = coords_for_bezel;
+ //No need to draw anything outside this:
+ if (coords_for_bezel.x < 0 || coords_for_bezel.y < 0 || coords_for_bezel.x > 1.0 || coords_for_bezel.y > 1.0) return full_viewport;
+
+ //Main lut:
+ vec4 bezel = textureLod(monitor_body,coords_for_bezel,bezel_frame_lod);
+
+ //No need to draw anything on full alpha:
+ if (bezel.a == 0.0) return full_viewport;
+
+ //We use the red component of the bezel to express its luminance (define bezel_luminance bezel.r)
+ vec3 bezel_colored = bezel_color(bezel_luminance);
+
+ //This is the reflection to be composed over the bezel);
+ vec3 pixel_mirrored = texture(reflected_blurred_pass2,
+ coords_for_mirror + random( min(global.FinalViewportSize.z,global.FinalViewportSize.w), vTexCoord ) ).rgb;
+
+ //Take the reflection modifier from the texture blue component into account; it is/may be used to lower the reflection in the corners.
+ //float reflection = (reflection_shade * 1.4 - 0.4) * bezel.b ;
+ //reflection = clamp (reflection, 0.0, 1.0);
+ float reflection = bezel.b;
+
+ vec3 bezel_out = bezel_colored + (pixel_mirrored * reflection * 0.5) ;
+
+ //Mix a bit of ambient light over the bezel
+ vec4 pixel_avglum = texture(avglum_pass,vOutputCoord);
+ bezel_out = bezel_out + (pixel_avglum.rgb * 0.05);
+
+ //We use the green component to express Hardness/Specularity; there the reflection will be completely diffused.
+ //For the task, we use a mipmap whit adeguate precision.
+ float lut_hardness = bezel.g;
+ if (lut_hardness > 0.0) {
+ bezel_out = bezel_out + ( ( pixel_avglum.rgb + pixel_avglum.a*0.5) * lut_hardness/3.5);
+ }
+
+ return mix(full_viewport, bezel_out, bezel.a);
+}
+
+vec4 pixel_inner_frame(vec2 coords, bool bBorder_needed) {
+//This takes care of drawing the main content.
+
+ vec4 pixel_in = pixel_main_pass(coords, bBorder_needed);
+ vec3 pixel_out = pixel_in.rgb;
+ vec3 bloomed;
+
+ //Mix bloom texture
+ if (DO_BLOOM == 1.0 ) {
+ bloomed=texture(bloom_pass_final, coords).rgb ;
+ if (BLOOM_BYPASS == 1.0)
+ pixel_out = bloomed;
+ else {
+ float over_white_correction = 1.0;
+ if (BLOOM_OVER_WHITE < 1.0) {
+ //Use mipmap to identify bright areas.
+ vec3 avglum = texture(avglum_pass,coords).rgb;
+ //avglum = apply_fuzzy_main_pass(avglum);
+ float b_brightness = max(avglum.b,max(avglum.r,avglum.g));
+ //b_brightness = max(pixel_out.b,max(pixel_out.r,pixel_out.g));
+
+ b_brightness *= 1-BLOOM_OVER_WHITE;
+ over_white_correction =1- b_brightness;
+ }
+
+ pixel_out = pixel_out + (bloomed * BLOOM_MIX * over_white_correction);
+ }
+ }
+
+ //Black frame insertion
+ if (DO_ALT_BLANK == 1.0 ) {
+ pixel_out = pixel_alternate(pixel_out.rgb, ALT_BLANK_STRENGTH );
+ }
+
+ //vignette and spot
+ if (DO_VIGNETTE + DO_SPOT >0.0) {
+ float in_aspect = get_in_aspect();
+
+ if (DO_VIGNETTE == 1.0) {
+ float vignette;
+ float dist = length(vec2((coords.x-0.5)*in_aspect,coords.y-0.5));
+ vignette = smoothstep(V_SIZE,0.0,dist)*V_POWER+global_noise;
+ if (V_BYPASS < 1.0) pixel_out = vignette * clamp(pixel_out,0.0,1.0);
+ else
+ pixel_out = vec3(vignette);
+ }
+
+ if (DO_SPOT == 1.0) {
+ float spot;
+ float dist = length(vec2((coords.x-0.5)*in_aspect,coords.y-0.5)+spot_offset);
+ spot = smoothstep(S_SIZE,0.0,dist)*S_POWER+global_noise;
+ if (S_BYPASS < 1.0) pixel_out = spot + pixel_out;
+ else
+ pixel_out = vec3(spot);
+ }
+ }
+
+ //smooth border (edge)
+ float border_inner_frame = 1.0;
+ if (DO_BEZEL==1.0 || DO_CURVATURE == 1.0)
+ border_inner_frame = border(coords);
+
+ float pixel_out_alpha = pixel_in.a * border_inner_frame;
+
+ //Out
+ return vec4(pixel_out,pixel_out_alpha) * border_inner_frame;
+}
+
+
+vec4 main_wrap(vec2 coords){
+ /* Handle inner border and outer border, not bezel */
+ if (DO_VIGNETTE + DO_SPOT + DO_AMBILIGHT >0.0) global_noise = random(NOISEPOWER, vTexCoord * params.FrameCount);
+
+ //Just do pixel_inner_frame() and exit when there is no need to paint border.
+ if (!border_needed()) return pixel_inner_frame(coords, false);
+
+ //From now on, we need a border.
+ bool bIs_outer_frame = ((vTexCoord.x < 0.0) || (vTexCoord.x > 1.0));
+
+ //Handle outer frame cases
+ //if we want ambilights in the outer frame, draw it and return
+ if (bIs_outer_frame)
+ return vec4(pixel_border(BG_IMAGE_OVER == 1.0),1.0);
+
+ //But if it is just outer frame, just make it black.
+ if (bIs_outer_frame) return vec4(0.0);
+
+
+ //Handle inner frame cases
+ vec4 vPixel_inner_frame = pixel_inner_frame(coords, true);
+ //mix ambilight in the inner frame too, as curvature could shrink into the inner frame.
+ bool draw_border = true;
+ //Not painting ambilights here is the best way to cheaply draw a border around the frame
+ if (DO_BEZEL == 1.0) {
+ vec2 vTexCoord_zoomout = zoomout_coords(vTexCoord, -BEZEL_INNER_ZOOM , 1.0);
+ float border_start = 1-BEZEL_IMAGE_BORDER;
+ //Not using curved coords here because crazy things would happen with vertical games
+ draw_border = vTexCoord_zoomout.x < border_start || vTexCoord_zoomout.x > BEZEL_IMAGE_BORDER ||
+ vTexCoord_zoomout.y < border_start || vTexCoord_zoomout.y > BEZEL_IMAGE_BORDER ;
+ }
+ if (draw_border)
+ return vec4(mix(pixel_border(BG_IMAGE_OVER == 1.0).rgb,vPixel_inner_frame.rgb,min(vPixel_inner_frame.a*1.5,1.0)),vPixel_inner_frame.a);
+ //return vec4(1.0,0.0,0.0,1.0);
+
+ //Last case, inner border without ambilight:
+ return vPixel_inner_frame;
+}
+
+
+void main() {
+
+ vec2 coords = vTexCoord;
+ //Luminosity dependant zoom
+ if (DO_DYNZOOM == 1.0) {
+ float zoomin = 1.0 + (texture(avglum_passFeedback, vec2(0.25,0.25) ).a/ DYNZOOM_FACTOR);
+ coords = zoom(coords, zoomin);
+ }
+
+ //Curvature
+ if (DO_CURVATURE == 1.0) {
+ if ((GEOM_WARP_X > 0.0) || (GEOM_WARP_Y > 0.0))
+ coords = Warp(coords,GEOM_WARP_X,GEOM_WARP_Y);
+ }
+
+ //Scale coords according to bezel settings?
+ if (DO_BEZEL == 1.0) {
+ coords = zoomout_coords(coords, -BEZEL_INNER_ZOOM , 1.0);
+ }
+
+ //"Just" handle inner and outer frame here:
+ vec4 pixel_out = main_wrap(coords);
+
+ //Draw bezel
+ if (DO_BEZEL == 1.0) {
+ pixel_out = vec4(compose_bezel_over(pixel_out.rgb),1.0);
+ }
+
+ //Draw an image "Over" the bezel with an hole inside by the alpha channel
+ if (DO_BG_IMAGE == 1.0 && BG_IMAGE_OVER==1.0) {
+ vec4 bg_image = pixel_background_image(true);
+ pixel_out = mix(pixel_out,bg_image,bg_image.a);
+ }
+
+ //For debug purposes:
+ //quad split screen
+ //if ( (vOutputCoord.x < 0.5 && vOutputCoord.y > 0.5) || (vOutputCoord.x > 0.5 && vOutputCoord.y < 0.5) ) pixel_out = texture(first_pass,vOutputCoord);
+ //split screen
+ //if (vTexCoord.y < 0.5) pixel_out = texture(first_pass,vTexCoord);
+ //pixel_out = texture(avglum_pass,vTexCoord);
+
+ FragColor = pixel_out;
+}
diff --git a/bezel/koko-aio/shaders/first_pass.slang b/bezel/koko-aio/shaders/first_pass.slang
new file mode 100644
index 0000000..d78a754
--- /dev/null
+++ b/bezel/koko-aio/shaders/first_pass.slang
@@ -0,0 +1,177 @@
+#version 450
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 4) out vec3 temperature_rgb;
+
+#include "includes/functions.include.slang"
+
+
+vec3 kelvin2rgb(float k) {
+ //Convert kelvin temperature to rgb factors
+ k = clamp(k,1000,40000);
+ k=k/100.0;
+ float tmpCalc;
+ vec3 pixel_out;
+ if (k<=66) {
+ pixel_out.r = 255;
+ pixel_out.g = 99.47080258612 * log(k) - 161.11956816610;
+ } else {
+ pixel_out.r = 329.6987274461 * pow(k - 60 ,-0.13320475922);
+ pixel_out.g = 288.12216952833 * pow(k-60, -0.07551484921);
+ }
+
+ if (k >= 66)
+ pixel_out.b = 255;
+ else if (k<=19)
+ pixel_out.b = 0;
+ else
+ pixel_out.b = 138.51773122311 * log(k - 10) - 305.04479273072;
+
+ return pixel_out/255.0;
+}
+
+
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+ if (TEMPERATURE != 6500)
+ temperature_rgb = kelvin2rgb(TEMPERATURE);
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 4) in vec3 temperature_rgb;
+layout(location = 0) out vec4 FragColor;
+
+layout(set = 0, binding = 2) uniform sampler2D Source;
+
+#include "includes/functions.include.slang"
+
+vec3 color_tools(vec3 pixel_out) {
+//Apply color corrections to input signal.
+
+ //Push luminance without clipping
+ pixel_out = pixel_push_luminance(pixel_out,LUMINANCE);
+
+ //Modify saturation
+ if (!(SATURATION == 1.0)) {
+ const vec3 W = vec3(0.2125, 0.7154, 0.0721);
+ vec3 intensity = vec3(dot(pixel_out.rgb, W));
+ pixel_out.rgb = mix(intensity, pixel_out.rgb, SATURATION);
+ }
+
+ //Modify contrast and brightness
+ if (CONTRAST != 0.0 || BRIGHTNESS != 0.0)
+ pixel_out.rgb = scale_to_range_vec3(pixel_out.rgb, -CONTRAST, 1+CONTRAST) + BRIGHTNESS;
+
+ //Modify color temperature
+ if (TEMPERATURE != 6500.0) pixel_out.rgb = pixel_out.rgb * temperature_rgb;
+ return pixel_out;
+}
+
+
+vec3 pixel_no_flicker(vec2 coord){
+ vec3 pixel_out = texture(Source,coord).rgb;
+ if (DO_CCORRECTION == 1.0)
+ pixel_out = color_tools(pixel_out);
+ return pixel_out.rgb;
+}
+
+vec3 pixel_flickering() {
+/* Simulates the flickering effect of the interlaced screens.
+ * As I remember, it was visible when a line and the next had high
+ * luminosity differences.
+ * So we need sample the current line and the previous one
+ * (eventually applying color corrections to both).
+ *
+ * Repeating the following:
+ * On frame 0, return the "clean" pixel
+ * On frame 1, mix the upper pixel with the current one
+ * On frame 2, mix the lower pixel with the current one
+ *
+ * The effect of the mix is the flickering itself, and we modulate
+ * the mix according to the luminance difference between the current
+ * pixel and the mixed one.
+ *
+ * We choose to alternate on a period of 3,
+ * (thus considering the upper pixel and the lower one)
+ * or else the high pixel persistance of lcd displays wont allow
+ * to see the effect (the lcd panel would just mix the pixels by itself (meh).
+ */
+
+ vec3 pixel_cur = pixel_no_flicker(vTexCoord);
+ float mymod = params.FrameCount % 3;
+
+ if (mymod == 0.0) return pixel_cur;
+ float line_tick = (params.OriginalSize.y > MIN_LINES_INTERLACED ) ? 1 : 2 ;
+
+ vec3 flickline;
+ if (mymod == 1.0 )
+ flickline = pixel_no_flicker(vTexCoord + vec2(0.0,params.OriginalSize.w/line_tick));
+ else if (mymod == 2.0)
+ flickline = pixel_no_flicker(vTexCoord - vec2(0.0,params.OriginalSize.w/line_tick));
+
+ float lumdiff = (flickline.r+flickline.g+flickline.b)/3.0 -
+ (pixel_cur.r+pixel_cur.g+pixel_cur.b)/3.0;
+
+ if (lumdiff > 0.0) {
+ lumdiff = scale_to_range(lumdiff,0.0,SCANLINE_FLICKERING_POWER);
+ return mix(pixel_cur,flickline,lumdiff);
+ } else {
+ return pixel_cur;
+ }
+}
+
+
+void debug() {
+//Just test patterns here
+ vec3 pixel_debug;
+ //Use one of the following to debug:
+ //pixel_debug=vec3(abs(sin(params.FrameCount/3.14/8.0))); //white fade
+ //pixel_debug=vec3(abs(sin(params.FrameCount/3.14/20)),0.0,0.0); //red fade
+ //pixel_debug=vec3(1.0);
+ //pixel_debug=vec3(0.0,1.0,0.0);
+ //pixel_debug=vec3(0.38,0.0,1.0)*vTexCoord.x;
+ pixel_debug=vec3(vTexCoord.x); //H bw gradient
+ //pixel_debug=vec3(floor(vTexCoord.x*16)/16); //H bw gradient 16gray
+ //pixel_debug=vec3(floor(vTexCoord.x*64)/64); //H bw gradient 64gray
+ //pixel_debug=vec3(floor(vTexCoord.x*128)/128); //H bw gradient 128gray
+ //pixel_debug=vec3(1,0,0,0)*floor(vTexCoord.x*64)/64; //H red gradient 64
+ //if (mod(params.FrameCount,100) < 50) pixel_debug=vec3(0.0) ; else pixel_debug=vec3(1.0);
+ //FragColor = vec4(color_tools(pixel_debug).rgb,1.0);
+ FragColor = vec4(pixel_debug,1.0);
+}
+
+
+void main() {
+
+ //debug(); return;
+
+ /* since flickering code needs
+ luminosity difference between 2 vertical lines
+ both have to be processed through color corrections and rgb pixel offsets.
+ before flickering code can operate. (pixel_no_flicker)
+ Therefore we call pixel_no_flicker inside it when we want flickering scanlines
+ and outside id when we dont.
+ */
+
+ if (DO_SCANLINES == 0.0) {
+ FragColor= vec4(pixel_no_flicker(vTexCoord),1.0);
+ return;
+ }
+
+ //Implicit else: DO_SCANLINES == 1.0
+ if (scanline_have_to_flicker(is_interlaced())) {
+ FragColor = vec4(pixel_flickering(),1.0);
+ return;
+ }
+
+ //Implicit else: DO_SCANLINES == 1.0 but no flickering needed.
+ FragColor = vec4(pixel_no_flicker(vTexCoord),1.0);
+}
+
+
diff --git a/bezel/koko-aio/shaders/fxaa.slang b/bezel/koko-aio/shaders/fxaa.slang
new file mode 100644
index 0000000..e6cdf3d
--- /dev/null
+++ b/bezel/koko-aio/shaders/fxaa.slang
@@ -0,0 +1,271 @@
+#version 450
+#include "config.inc"
+
+/**
+ * @license
+ * Copyright (c) 2011 NVIDIA Corporation. All rights reserved.
+ *
+ * TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
+ * *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
+ * OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT,IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA
+ * OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT, OR
+ * CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS
+ * OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY
+ * OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
+ * EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ */
+
+/*
+FXAA_PRESET - Choose compile-in knob preset 0-5.
+------------------------------------------------------------------------------
+FXAA_EDGE_THRESHOLD - The minimum amount of local contrast required
+ to apply algorithm.
+ 1.0/3.0 - too little
+ 1.0/4.0 - good start
+ 1.0/8.0 - applies to more edges
+ 1.0/16.0 - overkill
+------------------------------------------------------------------------------
+FXAA_EDGE_THRESHOLD_MIN - Trims the algorithm from processing darks.
+ Perf optimization.
+ 1.0/32.0 - visible limit (smaller isn't visible)
+ 1.0/16.0 - good compromise
+ 1.0/12.0 - upper limit (seeing artifacts)
+------------------------------------------------------------------------------
+FXAA_SEARCH_STEPS - Maximum number of search steps for end of span.
+------------------------------------------------------------------------------
+FXAA_SEARCH_THRESHOLD - Controls when to stop searching.
+ 1.0/4.0 - seems to be the best quality wise
+------------------------------------------------------------------------------
+FXAA_SUBPIX_TRIM - Controls sub-pixel aliasing removal.
+ 1.0/2.0 - low removal
+ 1.0/3.0 - medium removal
+ 1.0/4.0 - default removal
+ 1.0/8.0 - high removal
+ 0.0 - complete removal
+------------------------------------------------------------------------------
+FXAA_SUBPIX_CAP - Insures fine detail is not completely removed.
+ This is important for the transition of sub-pixel detail,
+ like fences and wires.
+ 3.0/4.0 - default (medium amount of filtering)
+ 7.0/8.0 - high amount of filtering
+ 1.0 - no capping of sub-pixel aliasing removal
+*/
+
+#ifndef FXAA_PRESET
+ #define FXAA_PRESET 4
+#endif
+
+#if (FXAA_PRESET == 6)
+ #define FXAA_EDGE_THRESHOLD (1.0/16.0)
+ #define FXAA_EDGE_THRESHOLD_MIN (1.0/12.0)
+ #define FXAA_SEARCH_STEPS 128
+ #define FXAA_SEARCH_THRESHOLD (1.0/16.0)
+ #define FXAA_SUBPIX_CAP (1.0)
+ #define FXAA_SUBPIX_TRIM (0.0)
+#endif
+
+#if (FXAA_PRESET == 3)
+ #define FXAA_EDGE_THRESHOLD (1.0/16.0)
+ #define FXAA_EDGE_THRESHOLD_MIN (1.0/16.0)
+ #define FXAA_SEARCH_STEPS 16
+ #define FXAA_SEARCH_THRESHOLD (1.0/4.0)
+ #define FXAA_SUBPIX_CAP (3.0/4.0)
+ #define FXAA_SUBPIX_TRIM (1.0/4.0)
+#endif
+#if (FXAA_PRESET == 4)
+ #define FXAA_EDGE_THRESHOLD (1.0/8.0)
+ #define FXAA_EDGE_THRESHOLD_MIN (1.0/24.0)
+ #define FXAA_SEARCH_STEPS 8
+ #define FXAA_SEARCH_THRESHOLD (1.0/4.0)
+ #define FXAA_SUBPIX_CAP (3.0/4.0)
+ #define FXAA_SUBPIX_TRIM (1.0/8.0)
+#endif
+#if (FXAA_PRESET == 5)
+ #define FXAA_EDGE_THRESHOLD (1.0/16.0)
+ #define FXAA_EDGE_THRESHOLD_MIN (1.0/12.0)
+ #define FXAA_SEARCH_STEPS 32
+ #define FXAA_SEARCH_THRESHOLD (1.0/4.0)
+ #define FXAA_SUBPIX_CAP (7.0/8.0)
+ #define FXAA_SUBPIX_TRIM (1.0/8.0)
+#endif
+
+#define FXAA_SUBPIX_TRIM_SCALE (1.0/(1.0 - FXAA_SUBPIX_TRIM))
+
+// Return the luma, the estimation of luminance from rgb inputs.
+// This approximates luma using one FMA instruction,
+// skipping normalization and tossing out blue.
+// FxaaLuma() will range 0.0 to 2.963210702.
+float FxaaLuma(vec3 rgb) {
+ return rgb.y * (0.587/0.299) + rgb.x;
+}
+
+vec3 FxaaLerp3(vec3 a, vec3 b, float amountOfA) {
+ return (vec3(-amountOfA) * b) + ((a * vec3(amountOfA)) + b);
+}
+
+vec4 FxaaTexOff(sampler2D tex, vec2 pos, ivec2 off, vec2 rcpFrame) {
+ float x = pos.x + float(off.x) * rcpFrame.x;
+ float y = pos.y + float(off.y) * rcpFrame.y;
+ return textureLod(tex, vec2(x, y),0);
+}
+
+// pos is the output of FxaaVertexShader interpolated across screen.
+// xy -> actual texture position {0.0 to 1.0}
+// rcpFrame should be a uniform equal to {1.0/frameWidth, 1.0/frameHeight}
+vec3 FxaaPixelShader(vec2 pos, sampler2D tex, vec2 rcpFrame)
+{
+ vec3 rgbN = FxaaTexOff(tex, pos.xy, ivec2( 0,-1), rcpFrame).xyz;
+ vec3 rgbW = FxaaTexOff(tex, pos.xy, ivec2(-1, 0), rcpFrame).xyz;
+ vec3 rgbM = FxaaTexOff(tex, pos.xy, ivec2( 0, 0), rcpFrame).xyz;
+ vec3 rgbE = FxaaTexOff(tex, pos.xy, ivec2( 1, 0), rcpFrame).xyz;
+ vec3 rgbS = FxaaTexOff(tex, pos.xy, ivec2( 0, 1), rcpFrame).xyz;
+
+ float lumaN = FxaaLuma(rgbN);
+ float lumaW = FxaaLuma(rgbW);
+ float lumaM = FxaaLuma(rgbM);
+ float lumaE = FxaaLuma(rgbE);
+ float lumaS = FxaaLuma(rgbS);
+ float rangeMin = min(lumaM, min(min(lumaN, lumaW), min(lumaS, lumaE)));
+ float rangeMax = max(lumaM, max(max(lumaN, lumaW), max(lumaS, lumaE)));
+
+ float range = rangeMax - rangeMin;
+ if(range < max(FXAA_EDGE_THRESHOLD_MIN, rangeMax * FXAA_EDGE_THRESHOLD))
+ {
+ return rgbM;
+ }
+
+ vec3 rgbL = rgbN + rgbW + rgbM + rgbE + rgbS;
+
+ float lumaL = (lumaN + lumaW + lumaE + lumaS) * 0.25;
+ float rangeL = abs(lumaL - lumaM);
+ float blendL = max(0.0, (rangeL / range) - FXAA_SUBPIX_TRIM) * FXAA_SUBPIX_TRIM_SCALE;
+ blendL = min(FXAA_SUBPIX_CAP, blendL);
+
+ vec3 rgbNW = FxaaTexOff(tex, pos.xy, ivec2(-1,-1), rcpFrame).xyz;
+ vec3 rgbNE = FxaaTexOff(tex, pos.xy, ivec2( 1,-1), rcpFrame).xyz;
+ vec3 rgbSW = FxaaTexOff(tex, pos.xy, ivec2(-1, 1), rcpFrame).xyz;
+ vec3 rgbSE = FxaaTexOff(tex, pos.xy, ivec2( 1, 1), rcpFrame).xyz;
+ rgbL += (rgbNW + rgbNE + rgbSW + rgbSE);
+ rgbL *= vec3(1.0/9.0);
+
+ float lumaNW = FxaaLuma(rgbNW);
+ float lumaNE = FxaaLuma(rgbNE);
+ float lumaSW = FxaaLuma(rgbSW);
+ float lumaSE = FxaaLuma(rgbSE);
+
+ float edgeVert =
+ abs((0.25 * lumaNW) + (-0.5 * lumaN) + (0.25 * lumaNE)) +
+ abs((0.50 * lumaW ) + (-1.0 * lumaM) + (0.50 * lumaE )) +
+ abs((0.25 * lumaSW) + (-0.5 * lumaS) + (0.25 * lumaSE));
+ float edgeHorz =
+ abs((0.25 * lumaNW) + (-0.5 * lumaW) + (0.25 * lumaSW)) +
+ abs((0.50 * lumaN ) + (-1.0 * lumaM) + (0.50 * lumaS )) +
+ abs((0.25 * lumaNE) + (-0.5 * lumaE) + (0.25 * lumaSE));
+
+ bool horzSpan = edgeHorz >= edgeVert;
+ float lengthSign = horzSpan ? -rcpFrame.y : -rcpFrame.x;
+
+ if(!horzSpan)
+ {
+ lumaN = lumaW;
+ lumaS = lumaE;
+ }
+
+ float gradientN = abs(lumaN - lumaM);
+ float gradientS = abs(lumaS - lumaM);
+ lumaN = (lumaN + lumaM) * 0.5;
+ lumaS = (lumaS + lumaM) * 0.5;
+
+ if (gradientN < gradientS)
+ {
+ lumaN = lumaS;
+ lumaN = lumaS;
+ gradientN = gradientS;
+ lengthSign *= -1.0;
+ }
+
+ vec2 posN;
+ posN.x = pos.x + (horzSpan ? 0.0 : lengthSign * 0.5);
+ posN.y = pos.y + (horzSpan ? lengthSign * 0.5 : 0.0);
+
+ gradientN *= FXAA_SEARCH_THRESHOLD;
+
+ vec2 posP = posN;
+ vec2 offNP = horzSpan ? vec2(rcpFrame.x, 0.0) : vec2(0.0, rcpFrame.y);
+ float lumaEndN = lumaN;
+ float lumaEndP = lumaN;
+ bool doneN = false;
+ bool doneP = false;
+ posN += offNP * vec2(-1.0, -1.0);
+ posP += offNP * vec2( 1.0, 1.0);
+
+ for(int i = 0; i < FXAA_SEARCH_STEPS; i++) {
+ if(!doneN)
+ {
+ lumaEndN = FxaaLuma(textureLod(tex, posN.xy,0.0).xyz);
+ }
+ if(!doneP)
+ {
+ lumaEndP = FxaaLuma(textureLod(tex, posP.xy,0.0).xyz);
+ }
+
+ doneN = doneN || (abs(lumaEndN - lumaN) >= gradientN);
+ doneP = doneP || (abs(lumaEndP - lumaN) >= gradientN);
+
+ if(doneN && doneP)
+ {
+ break;
+ }
+ if(!doneN)
+ {
+ posN -= offNP;
+ }
+ if(!doneP)
+ {
+ posP += offNP;
+ }
+ }
+
+ float dstN = horzSpan ? pos.x - posN.x : pos.y - posN.y;
+ float dstP = horzSpan ? posP.x - pos.x : posP.y - pos.y;
+ bool directionN = dstN < dstP;
+ lumaEndN = directionN ? lumaEndN : lumaEndP;
+
+ if(((lumaM - lumaN) < 0.0) == ((lumaEndN - lumaN) < 0.0))
+ {
+ lengthSign = 0.0;
+ }
+
+
+ float spanLength = (dstP + dstN);
+ dstN = directionN ? dstN : dstP;
+ float subPixelOffset = (0.5 + (dstN * (-1.0/spanLength))) * lengthSign;
+ vec3 rgbF = textureLod(tex, vec2(
+ pos.x + (horzSpan ? 0.0 : subPixelOffset),
+ pos.y + (horzSpan ? subPixelOffset : 0.0)),0.0).xyz;
+ return FxaaLerp3(rgbL, rgbF, blendL);
+}
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D first_pass;
+
+
+
+void main() {
+ if ( DO_FXAA == 0.0 ) return;
+ FragColor = vec4(FxaaPixelShader(vTexCoord, first_pass, vec2(global.first_passSize.z, global.first_passSize.w)),0.0);
+}
diff --git a/bezel/koko-aio/shaders/halo.slang b/bezel/koko-aio/shaders/halo.slang
new file mode 100644
index 0000000..3be713f
--- /dev/null
+++ b/bezel/koko-aio/shaders/halo.slang
@@ -0,0 +1,60 @@
+#version 450
+#include "config.inc"
+#define pi 3.141592654
+
+// Blur sizes must not depend on input resolution
+#define scalemod_x (global.in_glow_passSize.x/360.0)
+#define scalemod_y (global.in_glow_passSize.y/270.0)
+
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 1) out vec2 vOutputCoord;
+
+
+void main() {
+ gl_Position = global.MVP * Position;
+ //vTexCoord = get_scaled_coords(TexCoord);
+ vTexCoord = TexCoord;
+ vOutputCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 1) in vec2 vOutputCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D FXAA_pass;
+layout(set = 0, binding = 3) uniform sampler2D first_pass;
+layout(set = 0, binding = 4) uniform sampler2D in_glow_pass;
+layout(set = 0, binding = 5) uniform sampler2D shift_and_bleed_pass;
+// What follows is an ugly optimization with a lot of code copied and pasted repeated multiple times,
+// shamlessly hidden into an include:
+#include "includes/pixel_glows.include.slang"
+
+
+vec4 main_wrap(void) {
+ //Halo
+ vec3 pixel_haloed;
+ vec2 halo_coords = vTexCoord;
+
+ if (DO_IN_GLOW == 1.0)
+ pixel_haloed = pixel_glow(in_glow_pass, HALO_W,HALO_H,HALO_POWER,HALO_GAMMA,halo_coords, global.FXAA_passSize, global.FXAA_passSize).rgb;
+ else if ( DO_SHIFT_RGB + DO_SAT_BLEED > 0.0)
+ pixel_haloed = pixel_glow(shift_and_bleed_pass, HALO_W,HALO_H,HALO_POWER,HALO_GAMMA,halo_coords, params.OutputSize, params.OutputSize).rgb;
+ else if (DO_FXAA > 0.0)
+ pixel_haloed = pixel_glow(FXAA_pass, HALO_W,HALO_H,HALO_POWER,HALO_GAMMA,halo_coords, global.FXAA_passSize, global.FXAA_passSize).rgb;
+ else
+ pixel_haloed = pixel_glow(first_pass, HALO_W,HALO_H,HALO_POWER,HALO_GAMMA,halo_coords, global.FXAA_passSize, global.FXAA_passSize).rgb;
+
+ return vec4(pixel_haloed.rgb,1.0);
+}
+
+
+
+void main() {
+ if (DO_HALO == 0.0 ) return;
+
+ FragColor = main_wrap();
+}
diff --git a/bezel/koko-aio/shaders/in_glow.slang b/bezel/koko-aio/shaders/in_glow.slang
new file mode 100644
index 0000000..f81a683
--- /dev/null
+++ b/bezel/koko-aio/shaders/in_glow.slang
@@ -0,0 +1,46 @@
+#version 450
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord ;
+}
+
+
+#pragma stage fragment
+
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 3) uniform sampler2D FXAA_pass;
+layout(set = 0, binding = 4) uniform sampler2D first_pass;
+layout(set = 0, binding = 5) uniform sampler2D shift_and_bleed_pass;
+
+// Blur sizes must not depend on input resolution
+#define scalemod_x (params.OutputSize.x/360.0)
+#define scalemod_y (params.OutputSize.y/270.0)
+
+// What follows is an ugly optimization with a lot of code copied and pasted repeated multiple times,
+// shamlessly hidden into an include:
+#include "includes/pixel_glows.include.slang"
+
+void main() {
+ if (DO_IN_GLOW == 0.0) return;
+
+ vec3 pixel_glowed;
+ if ( DO_SHIFT_RGB + DO_SAT_BLEED > 0.0)
+ pixel_glowed = pixel_glow(shift_and_bleed_pass, IN_GLOW_WH,IN_GLOW_WH,IN_GLOW_POWER,IN_GLOW_GAMMA,vTexCoord, params.OutputSize, params.OutputSize).rgb;
+ else if (DO_FXAA > 0.0)
+ pixel_glowed = pixel_glow(FXAA_pass, IN_GLOW_WH,IN_GLOW_WH,IN_GLOW_POWER,IN_GLOW_GAMMA,vTexCoord, params.OutputSize, params.OutputSize).rgb;
+ else
+ pixel_glowed = pixel_glow(first_pass, IN_GLOW_WH,IN_GLOW_WH,IN_GLOW_POWER,IN_GLOW_GAMMA,vTexCoord, params.OutputSize, params.OutputSize).rgb;
+
+ FragColor = vec4((pixel_glowed),1.0);
+}
+
diff --git a/bezel/koko-aio/shaders/includes/blooms.include.slang b/bezel/koko-aio/shaders/includes/blooms.include.slang
new file mode 100644
index 0000000..3e6000c
--- /dev/null
+++ b/bezel/koko-aio/shaders/includes/blooms.include.slang
@@ -0,0 +1,23 @@
+#include "pows.include.slang"
+#define Pi2 6.283
+#define bloom_directions 8
+
+#define b_offset_x -0.05 //Why is this needed by bloom?
+
+#define bdirections 8
+
+vec3 bloom(sampler2D smp, vec2 uv, vec4 smpsize, vec2 dest_size, float quality, float gamma, float start_offset, float lod) {
+ vec2 r = dest_size/smpsize.xy ;
+ vec3 lookup;
+ vec3 color = vec3(0.0,0.0,0.0);
+ float steps=0.0;
+
+ for( float d=start_offset; d MIN_LINES_INTERLACED);
+}
+
+float scale_to_range(float x, float dmin, float dmax) {
+ //Scales 0..1 range to a..b range
+ return ( (dmax-dmin) * x ) + dmin;
+}
+
+vec3 scale_to_range_vec3(vec3 x, float dmin, float dmax) {
+ //Scales 0..1 range to a..b range
+ return ( (dmax-dmin) * x ) + dmin;
+}
+
+vec2 scale_to_range_vec2(vec2 x, float dmin, float dmax) {
+ //Scales 0..1 range to a..b range
+ return ( (dmax-dmin) * x ) + dmin;
+}
+
+#define RND_A 12.9898
+#define RND_B 78.233
+#define RND_C 43758.5453
+
+float random(float power, vec2 seed) {
+ //From pal-singlepass.slang
+ //https://github.com/svofski/CRT
+ //Copyright (c) 2016, Viacheslav Slavinsky
+ //All rights reserved.
+ float dt = dot(seed.xy, vec2(RND_A, RND_B));
+ float sn = mod(dt,3.14);
+
+ float noise_out = fract(sin(sn) * RND_C) - 0.5;
+ noise_out = clamp(noise_out, -power, power);
+ return noise_out ;
+}
+
+
+//CURVATURE
+ #define corner_aspect vec2(1.0, 0.75)
+ float border(vec2 coord)
+ {
+ coord = (coord - vec2(0.5)) + vec2(0.5, 0.5);
+ coord = min(coord, vec2(1.0) - coord) * corner_aspect;
+ vec2 cdist = vec2(GEOM_CORNER_SIZE);
+ coord = (cdist - min(coord, cdist));
+ float dist = sqrt(dot(coord, coord));
+ return clamp((cdist.x - dist)*GEOM_CORNER_SMOOTH, 0.0, 1.0);
+ }
+
+
+ vec2 Warp(vec2 uv,float wx, float wy){
+ uv = uv * 2.0 - 1.0;
+ vec2 CRT_Distortion = vec2(wx, wy);
+ float curvedCoordsDistance = length(uv);
+ uv /= curvedCoordsDistance;
+ uv *= (1.0-pow(vec2(1.0-(curvedCoordsDistance/1.4142135623730950488016887242097)),(1.0/(1.0+CRT_Distortion*0.2))));
+ uv /= (1.0-pow(vec2(0.29289321881345247559915563789515),(1.0/(vec2(1.0)+CRT_Distortion*0.2))));
+ uv = uv* 0.5 + 0.5;
+ return uv;
+ }
+
+
+//VIGNETTE - SPOT
+/* float gauss(float x, float x0, float sx, float size, float power){
+ float arg = x-x0;
+ arg = -(1/size)/2.*arg*arg/sx;
+ float a = 1./(pow(2.*3.1415*sx, 0.5));
+ return a*exp(arg) * power;
+ }
+
+ float gauss_xy(float pos_x, float pos_y, float size, float power, float gmin, float gmax) {
+ vec2 uv = vTexCoord.xy + vec2(pos_x,pos_y);
+ float scale_uv = params.SourceSize.x / params.SourceSize.y;
+ float gx = gauss(uv.x* scale_uv, 0.5*scale_uv, 0.1, size, power);
+ float gy = gauss(uv.y, 0.5, 0.1, size, power);
+ float light = gx*gy;
+ return clamp(light,gmin,gmax);
+ }
+*/
+
+//AMBILIGHT RELATED
+ bool border_needed() {
+ //returns if we need to draw on the border
+ return (DO_AMBILIGHT + DO_BG_IMAGE > 0.0);
+ }
+
+
+ #define mark_useless(x) mark_outer_frame(x)
+ vec4 mark_outer_frame(vec3 pixel) {
+ return vec4(pixel.rgb,0.0) ;
+ //For my mental sanity, I use a specific alpha channel value to mark a frame as a border
+ return vec4(pixel.r,pixel.g,pixel.b,alpha_mark) ;
+ }
+ #define is_useless(x) is_outer_frame(x)
+ bool is_outer_frame(vec4 pixel) {
+ return pixel.a == 0.0;
+ /*Check if a pixel is marked as border by comparing the value of its alpha channel
+ Tolerance is needed, because precision can be as low as 1/256; since I don't need
+ alpha channel, use an even large tolerance.
+ */
+ return abs(pixel.a - alpha_mark) < 0.05; //<-- 0.05 allow about 20 alpha levels (1*0.05)
+ }
+
+ #define ar_tolerance 0.1 //To compensate when comparing different A/R
+ bool is_rotated() {
+ /*
+ For some reason, probably retroarch rotates the view only on final viewport stage, transparent to the shader passes,
+ The OutputSize of a pass that scales to viewport will have different aspect from the real final viewport.
+ We exploit this to understand when a game is rotated.
+ -->> This function only works if the calling pass scales to viewport.
+ This will fail for very particular cases, eg: when output window is extremely tall
+ */
+ return (abs((params.OutputSize.x/params.OutputSize.y) - (global.FinalViewportSize.x/global.FinalViewportSize.y)) > ar_tolerance);
+ }
+
+ float get_in_aspect() {
+ if (ASPECT_X == -1) return 1.5; // ntsc
+ if (ASPECT_X == -2) return 1.25; // pal
+ if (ASPECT_X == -3) return 1.143; // 8/7 snes
+ if (ASPECT_X == -4) return 1.428; // 10/7 megadrive
+ if (ASPECT_X == -5) return params.OriginalSize.x/params.OriginalSize.y; //uncorrected
+
+ if (ASPECT_X == 0) {
+ return 1.3333333333333; //all mame games, not rotated
+ }
+
+ return ASPECT_X / ASPECT_Y ;
+ }
+
+ vec2 get_scaled_coords_aspect(vec2 pTexCoord, vec4 destsize, float in_aspect , bool is_rotated){
+ if (!border_needed()) return pTexCoord;
+ //else
+ float scale_x = 1.0;
+ float scale_y = 1.0;
+ float offset_x = 0.0 ;
+ float offset_y = 0.0 ;
+ if (is_rotated) {
+ scale_y = destsize.x/(destsize.y / in_aspect );
+ offset_y = (0.5 * scale_y ) - 0.5 ;
+ } else {
+ scale_x = destsize.x/(destsize.y * in_aspect);
+ offset_x = (0.5 * scale_x ) - 0.5 ;
+ }
+
+ vec2 scale_coord=vec2(pTexCoord.x*scale_x - offset_x , pTexCoord.y*scale_y - offset_y);
+ return scale_coord;
+ }
+
+ vec2 get_scaled_coords(vec2 pTexCoord, vec4 destsize, bool is_rotated){
+ if (!border_needed()) return pTexCoord;
+ //else
+ float scale_x = 1.0;
+ float scale_y = 1.0;
+ float offset_x = 0.0 ;
+ float offset_y = 0.0 ;
+ float in_aspect = get_in_aspect();
+ if (is_rotated) {
+ //I'm doing ping pong between th the following 2:
+ //FIXME: verify if it depends on destsize being outputsize or finalviewportsize!!
+ //scale_y = destsize.y/(destsize.x / in_aspect );
+ scale_y = destsize.x/(destsize.y / in_aspect );
+
+ offset_y = (0.5 * scale_y ) - 0.5 ;
+
+
+ } else {
+ //scale_x = params.OutputSize.x/(params.OutputSize.y * in_aspect);
+ //scale_x = global.FinalViewportSize.x/(global.FinalViewportSize.y * in_aspect);
+ scale_x = destsize.x/(destsize.y * in_aspect);
+ offset_x = (0.5 * scale_x ) - 0.5 ;
+ }
+
+ vec2 scale_coord=vec2(pTexCoord.x*scale_x - offset_x , pTexCoord.y*scale_y - offset_y);
+ return scale_coord;
+ }
+
+
+
diff --git a/bezel/koko-aio/shaders/includes/pack_unpack.include.slang b/bezel/koko-aio/shaders/includes/pack_unpack.include.slang
new file mode 100644
index 0000000..e9bb40b
--- /dev/null
+++ b/bezel/koko-aio/shaders/includes/pack_unpack.include.slang
@@ -0,0 +1,64 @@
+/* pack_2to1_f and unpack_1to2_float
+ * Take 2 floats and pack them into one
+ * #pragma format R32G32B32A32_SFLOAT needed
+ * The brighter color is lost.
+*/
+ #define pack_floats_clamp 0.996078431372549 //1-(1/255)
+ #define pack_floats_precision 255.0
+ float pack_2to1_f(vec2 in_float){
+ //Clamp and round to 1/255 needed:
+ in_float = min(in_float,pack_floats_clamp);
+ in_float = floor(in_float*255.0)/255.0;
+ return in_float.x*pack_floats_precision + in_float.y;
+ }
+
+ vec2 unpack_1to2_float(float f){
+ float fr = fract(f);
+ float fg = floor(f)/pack_floats_precision;
+ return vec2(fr,fg);
+ }
+
+ //pack 2 vec3 into one
+ vec3 pack_2to1_vec3(vec3 v1, vec3 v2) {
+ return vec3(
+ pack_2to1_f(vec2(v1.r,v2.r)),
+ pack_2to1_f(vec2(v1.g,v2.g)),
+ pack_2to1_f(vec2(v1.b,v2.b))
+ );
+ }
+ void unpack_1to2_vec3(in vec3 v, out vec3 v1, out vec3 v2) {
+ vec2 t;
+ t.xy = unpack_1to2_float(v.r);
+ v1.r = t.x;
+ v2.r = t.y;
+ t.xy = unpack_1to2_float(v.g);
+ v1.g = t.x;
+ v2.g = t.y;
+ t.xy = unpack_1to2_float(v.b);
+ v1.b = t.x;
+ v2.b= t.y;
+ }
+
+/* packColor and unpackColor
+ * Take a vec3 and pack them into one float
+ * #pragma format R32G32B32A32_SFLOAT needed
+ * The brighter colors (2) are lost.
+*/
+ #define mul_low 65025.0 //(pow(255.0,2.0))
+ #define mul_mid 16581375.0 //(pow(255.0,3.0))
+ #define mul_hi 4228250625.0 //(pow(255.0,4.0))
+
+ #define pack_color_clamp 0.992156862745098 // 1.0-(2.0/255)
+
+ float packColor(vec3 color) {
+ color = clamp(color,0.0, pack_color_clamp);
+ color = floor(color*255.0)/255.0;
+ return (color.b * mul_low) + (color.g * mul_mid) + (color.r * mul_hi) ;
+ }
+
+ vec3 unpackColor(float result) {
+ float hi = floor(result/mul_mid)*mul_mid;
+ float mid = floor((result - hi)/mul_low)*mul_low;
+ float low = result - hi - mid;
+ return vec3(hi/mul_hi, mid/mul_mid, low/mul_low);
+ }
diff --git a/bezel/koko-aio/shaders/includes/pixel_glows.include.slang b/bezel/koko-aio/shaders/includes/pixel_glows.include.slang
new file mode 100644
index 0000000..e332947
--- /dev/null
+++ b/bezel/koko-aio/shaders/includes/pixel_glows.include.slang
@@ -0,0 +1,988 @@
+
+//Those functions will sample from source texture (the previous), but with a precision taken from passthrough_passSize.
+//This is needed because the source texture has been scaled up to the dimension of the viewport to allow
+//the scanlines to be linear filtered.
+
+
+/*
+#include "pows.include.slang"
+
+
+
+
+
+vec4 pixel_glow_gamma_1(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+ // vec4 SourceSize1 = params.SourceSize;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+
+
+vec4 pixel_glow_gamma_2(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+ // vec4 SourceSize1 = params.SourceSize;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+ l3*=l3; l2*=l2; l1*=l1;
+ r1*=r1; r2*=r2; r3*=r3;
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+ l3*=l3; l2*=l2; l1*=l1;
+ r1*=r1; r2*=r2; r3*=r3;
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+ l3*=l3; l2*=l2; l1*=l1;
+ r1*=r1; r2*=r2; r3*=r3;
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+ l3*=l3; l2*=l2; l1*=l1;
+ r1*=r1; r2*=r2; r3*=r3;
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+vec4 pixel_glow_gamma_3(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+ // vec4 SourceSize1 = params.SourceSize;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+ l3=pow_3(l3); l2=pow_3(l2); l1=pow_3(l1);
+ r1=pow_3(r1); r2=pow_3(r2); r3=pow_3(r3);
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+ l3=pow_3(l3); l2=pow_3(l2); l1=pow_3(l1);
+ r1=pow_3(r1); r2=pow_3(r2); r3=pow_3(r3);
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+ l3=pow_3(l3); l2=pow_3(l2); l1=pow_3(l1);
+ r1=pow_3(r1); r2=pow_3(r2); r3=pow_3(r3);
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+ l3=pow_3(l3); l2=pow_3(l2); l1=pow_3(l1);
+ r1=pow_3(r1); r2=pow_3(r2); r3=pow_3(r3);
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+vec4 pixel_glow_gamma_4(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+ // vec4 SourceSize1 = params.SourceSize;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+ l3=pow_4(l3); l2=pow_4(l2); l1=pow_4(l1);
+ r1=pow_4(r1); r2=pow_4(r2); r3=pow_4(r3);
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+ l3=pow_4(l3); l2=pow_4(l2); l1=pow_4(l1);
+ r1=pow_4(r1); r2=pow_4(r2); r3=pow_4(r3);
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+ l3=pow_4(l3); l2=pow_4(l2); l1=pow_4(l1);
+ r1=pow_4(r1); r2=pow_4(r2); r3=pow_4(r3);
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+ l3=pow_4(l3); l2=pow_4(l2); l1=pow_4(l1);
+ r1=pow_4(r1); r2=pow_4(r2); r3=pow_4(r3);
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+vec4 pixel_glow_gamma_5(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+ // vec4 SourceSize1 = params.SourceSize;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+ l3=pow_5(l3); l2=pow_5(l2); l1=pow_5(l1);
+ r1=pow_5(r1); r2=pow_5(r2); r3=pow_5(r3);
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+ l3=pow_5(l3); l2=pow_5(l2); l1=pow_5(l1);
+ r1=pow_5(r1); r2=pow_5(r2); r3=pow_5(r3);
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+ l3=pow_5(l3); l2=pow_5(l2); l1=pow_5(l1);
+ r1=pow_5(r1); r2=pow_5(r2); r3=pow_5(r3);
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+ l3=pow_5(l3); l2=pow_5(l2); l1=pow_5(l1);
+ r1=pow_5(r1); r2=pow_5(r2); r3=pow_5(r3);
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+vec4 pixel_glow_gamma_6(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+ // vec4 SourceSize1 = params.SourceSize;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+ l3=pow_6(l3); l2=pow_6(l2); l1=pow_6(l1);
+ r1=pow_6(r1); r2=pow_6(r2); r3=pow_6(r3);
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+ l3=pow_6(l3); l2=pow_6(l2); l1=pow_6(l1);
+ r1=pow_6(r1); r2=pow_6(r2); r3=pow_6(r3);
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+ l3=pow_6(l3); l2=pow_6(l2); l1=pow_6(l1);
+ r1=pow_6(r1); r2=pow_6(r2); r3=pow_6(r3);
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+ l3=pow_6(l3); l2=pow_6(l2); l1=pow_6(l1);
+ r1=pow_6(r1); r2=pow_6(r2); r3=pow_6(r3);
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+vec4 pixel_glow_gamma_7(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+ // vec4 SourceSize1 = params.SourceSize;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+ l3=pow_7(l3); l2=pow_7(l2); l1=pow_7(l1);
+ r1=pow_7(r1); r2=pow_7(r2); r3=pow_7(r3);
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+ l3=pow_7(l3); l2=pow_7(l2); l1=pow_7(l1);
+ r1=pow_7(r1); r2=pow_7(r2); r3=pow_7(r3);
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+ l3=pow_7(l3); l2=pow_7(l2); l1=pow_7(l1);
+ r1=pow_7(r1); r2=pow_7(r2); r3=pow_7(r3);
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+ l3=pow_7(l3); l2=pow_7(l2); l1=pow_7(l1);
+ r1=pow_7(r1); r2=pow_7(r2); r3=pow_7(r3);
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+vec4 pixel_glow_gamma_8(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+ // vec4 SourceSize1 = params.SourceSize;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+ l3=pow_8(l3); l2=pow_8(l2); l1=pow_8(l1);
+ r1=pow_8(r1); r2=pow_8(r2); r3=pow_8(r3);
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+ l3=pow_8(l3); l2=pow_8(l2); l1=pow_8(l1);
+ r1=pow_8(r1); r2=pow_8(r2); r3=pow_8(r3);
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+ l3=pow_8(l3); l2=pow_8(l2); l1=pow_8(l1);
+ r1=pow_8(r1); r2=pow_8(r2); r3=pow_8(r3);
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+ l3=pow_8(l3); l2=pow_8(l2); l1=pow_8(l1);
+ r1=pow_8(r1); r2=pow_8(r2); r3=pow_8(r3);
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+vec4 pixel_glow_gamma_9(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+ // vec4 SourceSize1 = params.SourceSize;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+ l3=pow_9(l3); l2=pow_9(l2); l1=pow_9(l1);
+ r1=pow_9(r1); r2=pow_9(r2); r3=pow_9(r3);
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+ l3=pow_9(l3); l2=pow_9(l2); l1=pow_9(l1);
+ r1=pow_9(r1); r2=pow_9(r2); r3=pow_9(r3);
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+ l3=pow_9(l3); l2=pow_9(l2); l1=pow_9(l1);
+ r1=pow_9(r1); r2=pow_9(r2); r3=pow_9(r3);
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+ l3=pow_9(l3); l2=pow_9(l2); l1=pow_9(l1);
+ r1=pow_9(r1); r2=pow_9(r2); r3=pow_9(r3);
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+vec4 pixel_glow_gamma_10(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+ // vec4 SourceSize1 = params.SourceSize;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+ l3=pow_10(l3); l2=pow_10(l2); l1=pow_10(l1);
+ r1=pow_10(r1); r2=pow_10(r2); r3=pow_10(r3);
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+ l3=pow_10(l3); l2=pow_10(l2); l1=pow_10(l1);
+ r1=pow_10(r1); r2=pow_10(r2); r3=pow_10(r3);
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+ l3=pow_10(l3); l2=pow_10(l2); l1=pow_10(l1);
+ r1=pow_10(r1); r2=pow_10(r2); r3=pow_10(r3);
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+ l3=pow_10(l3); l2=pow_10(l2); l1=pow_10(l1);
+ r1=pow_10(r1); r2=pow_10(r2); r3=pow_10(r3);
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+
+vec3 blur_v(sampler2D in_texture, float my_glowpixy, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+
+ vec2 dy = vec2(0.0,SourceSize1.w) ;
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 y2 = 2.0*dy;
+
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ vec3 t1 = texture(in_texture, pC4 ).rgb;
+ vec3 t2 = texture(in_texture, pC4 -dy).rgb;
+ vec3 b1 = texture(in_texture, pC4 +dy).rgb;
+ vec3 b2 = texture(in_texture, pC4 +y2).rgb;
+
+ float wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ float wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ float wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ float wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ float wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 smoothed = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return smoothed;
+
+return vec3(1.0);
+
+}
+
+*/
+
+vec4 pixel_glow_std_pow(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, float glow_gamma, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ // Calculating texel coordinates
+ vec2 tex = coords.xy * 1.00001;
+
+ vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize2.xy - vec2(0.5,0.5); // vec2 OGL2Pos = tex * SourceSize1.xy - vec2(0.5,0.5);
+ vec2 fp = fract(OGL2Pos);
+ vec2 dx = vec2(SourceSize1.z,0.0) ; // vec2 dx = vec2(params.passthrough_and_cc_passSize.z,0.0) ; //
+ vec2 dy = vec2(0.0,SourceSize1.w) ; // vec2 dy = vec2(0.0,params.passthrough_and_cc_passSize.w); //
+ vec2 pC4 = (floor(OGL2Pos) + vec2(0.5)) * SourceSize2.zw;
+
+ vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
+ vec2 y2 = 2.0*dy;
+
+ vec3 glow_gamma_vec3 = vec3(glow_gamma);
+
+ my_glowpix = my_glowpix / scalemod_x * 2 ; // <-- Make it not dependant on the input resolution.
+ my_glowpixy = my_glowpixy / scalemod_y *2 ;
+
+ float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-my_glowpix*wl3);
+ float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-my_glowpix*wl2);
+ float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-my_glowpix*wl1);
+ float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-my_glowpix*wr1);
+ float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-my_glowpix*wr2);
+ float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-my_glowpix*wr3);
+
+ float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
+
+ vec3 l3 = texture(in_texture, pC4 -x2 ).rgb;
+ vec3 l2 = texture(in_texture, pC4 -dx ).rgb;
+ vec3 l1 = texture(in_texture, pC4 ).rgb;
+ vec3 r1 = texture(in_texture, pC4 +dx ).rgb;
+ vec3 r2 = texture(in_texture, pC4 +x2 ).rgb;
+ vec3 r3 = texture(in_texture, pC4 +x3 ).rgb;
+ l3=pow(l3,glow_gamma_vec3); l2=pow(l2,glow_gamma_vec3); l1=pow(l1,glow_gamma_vec3);
+ r1=pow(r1,glow_gamma_vec3); r2=pow(r2,glow_gamma_vec3); r3=pow(r3,glow_gamma_vec3);
+
+ vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 -dy).rgb;
+ l2 = texture(in_texture, pC4 -dx -dy).rgb;
+ l1 = texture(in_texture, pC4 -dy).rgb;
+ r1 = texture(in_texture, pC4 +dx -dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 -dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 -dy).rgb;
+ l3=pow(l3,glow_gamma_vec3); l2=pow(l2,glow_gamma_vec3); l1=pow(l1,glow_gamma_vec3);
+ r1=pow(r1,glow_gamma_vec3); r2=pow(r2,glow_gamma_vec3); r3=pow(r3,glow_gamma_vec3);
+
+ vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +dy).rgb;
+ l2 = texture(in_texture, pC4 -dx +dy).rgb;
+ l1 = texture(in_texture, pC4 +dy).rgb;
+ r1 = texture(in_texture, pC4 +dx +dy).rgb;
+ r2 = texture(in_texture, pC4 +x2 +dy).rgb;
+ r3 = texture(in_texture, pC4 +x3 +dy).rgb;
+ l3=pow(l3,glow_gamma_vec3); l2=pow(l2,glow_gamma_vec3); l1=pow(l1,glow_gamma_vec3);
+ r1=pow(r1,glow_gamma_vec3); r2=pow(r2,glow_gamma_vec3); r3=pow(r3,glow_gamma_vec3);
+
+ vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ l3 = texture(in_texture, pC4 -x2 +y2).rgb;
+ l2 = texture(in_texture, pC4 -dx +y2).rgb;
+ l1 = texture(in_texture, pC4 +y2).rgb;
+ r1 = texture(in_texture, pC4 +dx +y2).rgb;
+ r2 = texture(in_texture, pC4 +x2 +y2).rgb;
+ r3 = texture(in_texture, pC4 +x3 +y2).rgb;
+ l3=pow(l3,glow_gamma_vec3); l2=pow(l2,glow_gamma_vec3); l1=pow(l1,glow_gamma_vec3);
+ r1=pow(r1,glow_gamma_vec3); r2=pow(r2,glow_gamma_vec3); r3=pow(r3,glow_gamma_vec3);
+
+ vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
+
+ wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-my_glowpixy*wl2);
+ wl1 = fp.y; wl1*=wl1; wl1 = exp2(-my_glowpixy*wl1);
+ wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-my_glowpixy*wr1);
+ wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-my_glowpixy*wr2);
+
+ wt = 1.0/(wl2+wl1+wr1+wr2);
+
+ vec3 Bloom = (t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2)*wt;
+
+ return vec4(Bloom*my_glow,1.0);
+}
+
+
+
+vec4 dumb_glow(sampler2D in_texture, float my_glow, float glow_gamma, vec2 coords) {
+ vec3 pixel_in = texture(in_texture, coords ).rgb;
+ pixel_in = pow(pixel_in,vec3(glow_gamma))*my_glow;
+ return vec4(pixel_in,0.0);
+}
+
+vec4 pixel_glow(sampler2D in_texture, float my_glowpix, float my_glowpixy, float my_glow, float glow_gamma, vec2 coords, vec4 SourceSize1, vec4 SourceSize2) {
+
+ if ( (my_glowpix >= GLOW_SHARP_MAX) && (my_glowpixy >= GLOW_SHARP_MAX) ) {
+ return dumb_glow(in_texture, my_glow,glow_gamma,coords);
+ }
+
+ return pixel_glow_std_pow(in_texture,my_glowpix,my_glowpixy,my_glow,glow_gamma,coords,SourceSize1, SourceSize2);
+
+ //return pixel_glow_my_pow(in_texture,my_glowpix,my_glowpixy,my_glow,glow_gamma,coords,SourceSize1, SourceSize2);
+
+
+/* if (glow_gamma == 1) { return pixel_glow_gamma_1(in_texture, my_glowpix,my_glowpixy,my_glow,coords,SourceSize1, SourceSize2); }
+ if (glow_gamma == 2) { return pixel_glow_gamma_2(in_texture, my_glowpix,my_glowpixy,my_glow,coords,SourceSize1, SourceSize2); }
+ if (glow_gamma == 3) { return pixel_glow_gamma_3(in_texture,my_glowpix,my_glowpixy,my_glow,coords,SourceSize1, SourceSize2); }
+ if (glow_gamma == 4) { return pixel_glow_gamma_4(in_texture,my_glowpix,my_glowpixy,my_glow,coords,SourceSize1, SourceSize2); }
+ if (glow_gamma == 5) { return pixel_glow_gamma_5(in_texture,my_glowpix,my_glowpixy,my_glow,coords,SourceSize1, SourceSize2); }
+ if (glow_gamma == 6) { return pixel_glow_gamma_6(in_texture,my_glowpix,my_glowpixy,my_glow,coords,SourceSize1, SourceSize2); }
+ if (glow_gamma == 7) { return pixel_glow_gamma_7(in_texture,my_glowpix,my_glowpixy,my_glow,coords,SourceSize1, SourceSize2); }
+ if (glow_gamma == 8) { return pixel_glow_gamma_8(in_texture,my_glowpix,my_glowpixy,my_glow,coords,SourceSize1, SourceSize2); }
+ if (glow_gamma == 9) { return pixel_glow_gamma_9(in_texture,my_glowpix,my_glowpixy,my_glow,coords,SourceSize1, SourceSize2); }
+ if (glow_gamma == 10) { return pixel_glow_gamma_10(in_texture,my_glowpix,my_glowpixy,my_glow,coords,SourceSize1, SourceSize2); }
+ return pixel_glow_std_pow(in_texture,my_glowpix,my_glowpixy,my_glow,glow_gamma,coords,SourceSize1, SourceSize2);
+*/
+
+
+}
+
diff --git a/bezel/koko-aio/shaders/includes/pows.include.slang b/bezel/koko-aio/shaders/includes/pows.include.slang
new file mode 100644
index 0000000..acedf00
--- /dev/null
+++ b/bezel/koko-aio/shaders/includes/pows.include.slang
@@ -0,0 +1,59 @@
+vec3 pow_2(vec3 v) {
+ return v*v*v;
+}
+
+vec3 pow_3(vec3 v) {
+ return v*v*v;
+}
+
+vec3 pow_4(vec3 v) {
+ vec3 v2 = v*v;
+ return v2*v2;
+}
+
+vec3 pow_5(vec3 v) {
+ vec3 v2 = v*v;
+ return v2*v2*v;
+}
+
+vec3 pow_6(vec3 v) {
+ vec3 v2 = v*v;
+ return v2*v2*v2;
+}
+
+vec3 pow_7(vec3 v) {
+ vec3 v2 = v*v;
+ return v2*v2*v2*v;
+}
+
+vec3 pow_8(vec3 v) {
+ vec3 v2 = v*v;
+ vec3 v4 = v2*v2;
+ return v4*v4;
+}
+
+vec3 pow_9(vec3 v) {
+ vec3 v2 = v*v;
+ vec3 v4 = v2*v2;
+ return v4*v4*v;
+}
+
+vec3 pow_10(vec3 v) {
+ vec3 v2 = v*v;
+ vec3 v4 = v2*v2;
+ return v4*v4*v2;
+}
+
+vec3 my_pow(vec3 c,float p) {
+ if (p == 1) return c;
+ else if (p == 2) return c * c ;
+ else if (p == 3) return pow_3(c);
+ else if (p == 4) return pow_4(c);
+ else if (p == 5) return pow_5(c);
+ else if (p == 6) return pow_6(c);
+ else if (p == 7) return pow_7(c);
+ else if (p == 8) return pow_8(c);
+ else if (p == 9) return pow_9(c);
+ else if (p == 10) return pow_10(c);
+ return pow(c,vec3(p));
+}
diff --git a/bezel/koko-aio/shaders/isrotated.slang b/bezel/koko-aio/shaders/isrotated.slang
new file mode 100644
index 0000000..a1f0515
--- /dev/null
+++ b/bezel/koko-aio/shaders/isrotated.slang
@@ -0,0 +1,33 @@
+#version 450
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 1) out float mark_color_rotated;
+
+#include "includes/functions.include.slang"
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+ if (is_rotated())
+ mark_color_rotated = 1.0;
+ else
+ mark_color_rotated = 0.0;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 1) in float mark_color_rotated;
+layout(location = 0) out vec4 FragColor;
+
+layout(set = 0, binding = 2) uniform sampler2D Source;
+
+
+void main() {
+ FragColor.r = mark_color_rotated;
+}
+
+
diff --git a/bezel/koko-aio/shaders/old_unused/ambi_displace.slang b/bezel/koko-aio/shaders/old_unused/ambi_displace.slang
new file mode 100644
index 0000000..77fc7d5
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/ambi_displace.slang
@@ -0,0 +1,138 @@
+#version 450
+#include "config.inc"
+#define eps 1e-8
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 1) out vec2 vTexCoord_zoom;
+
+#include "functions.include.slang"
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+ vTexCoord_zoom = TexCoord;
+ if (DO_BEZEL==1.0 && BEZEL_INNER_ZOOM !=0.0) vTexCoord_zoom = zoomout_coords(TexCoord, -BEZEL_INNER_ZOOM , 1.0);
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 1) in vec2 vTexCoord_zoom;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D Original;
+layout(set = 0, binding = 3) uniform sampler2D main_pass;
+layout(set = 0, binding = 4) uniform sampler2D isrotated_pass;
+
+
+
+bool border_updown(){
+ //Return if black bars are up and down or left and right.
+ //Why this one work?
+ return ((params.OriginalSize.x > params.OriginalSize.y) && (global.main_passSize.x < global.main_passSize.y )) ||
+ (params.OriginalSize.x < params.OriginalSize.y) && (global.main_passSize.x > global.main_passSize.y ) ;
+}
+
+vec3 main_wrap(){
+
+ float myborder = 0.025; //20% border to be displaced
+ vec2 newcoords = vTexCoord_zoom;
+ vec3 pixel_out;
+ float mydiv;
+ float myoffset;
+
+ if (!border_updown()) {
+ mydiv = vTexCoord.x / myborder;
+ myoffset = (1.0-myborder) * floor(mydiv);
+
+ if (vTexCoord.x < 0.5)
+ newcoords.x = newcoords.x - ( myborder * floor(mydiv) ) ;
+ else
+ newcoords.x = (1 - myborder) + ( newcoords.x - (myborder*floor(mydiv)) ) ;
+
+ return texture(Original, newcoords).rgb;
+ }
+
+ //Is rotated
+ mydiv = vTexCoord.y / myborder;
+ myoffset = (1.0-myborder) * floor(mydiv);
+
+ if (vTexCoord.y < 0.5)
+ newcoords.y = newcoords.y - ( myborder * floor(mydiv) ) ;
+ else
+ newcoords.y = (1 - myborder) + ( newcoords.y - (myborder*floor(mydiv)) ) ;
+ return texture(Original, newcoords).rgb;
+
+
+}
+#include "functions.include.slang"
+ float mborder(vec2 coord,float aspect,float corner_size, float corner_smooth) {
+ coord = (coord - vec2(0.5)) + vec2(0.5, 0.5);
+ coord = min(coord, vec2(1.0) - coord) * aspect;
+ vec2 cdist = vec2(corner_size);
+ coord = (cdist - min(coord, cdist));
+ float dist = sqrt(dot(coord, coord));
+ return clamp((cdist.x - dist)*corner_smooth, 0.0, 1.0);
+ }
+
+
+ vec2 bget_scaled_coords(vec2 pTexCoord, vec4 destsize){
+ if (!border_needed()) return pTexCoord;
+ //else
+ float scale_x = 1.0;
+ float scale_y = 1.0;
+ float offset_x = 0.0 ;
+ float offset_y = 0.0 ;
+ float in_aspect = get_in_aspect();
+ if (is_rotated()) {
+ //scale_y = params.OutputSize.y/(params.OutputSize.x / in_aspect );
+ //scale_y = global.FinalViewportSize.y/(global.FinalViewportSize.x / in_aspect );
+ scale_y = destsize.y/(destsize.x / in_aspect );
+ offset_y = (0.5 * scale_y ) - 0.5 ;
+ } else {
+ //scale_x = params.OutputSize.x/(params.OutputSize.y * in_aspect);
+ //scale_x = global.FinalViewportSize.x/(global.FinalViewportSize.y * in_aspect);
+ scale_x = destsize.x/(destsize.y * in_aspect);
+ offset_x = (0.5 * scale_x ) - 0.5 ;
+ }
+
+ vec2 scale_coord=vec2(pTexCoord.x*scale_x - offset_x , pTexCoord.y*scale_y - offset_y);
+ return scale_coord;
+ }
+
+
+void main() {
+ if (DO_AMBILIGHT != 1.0) return;
+ //bool is_rotated = texture(isrotated_pass,vec2(0.5,0.5)).r > 0.5;
+
+
+ //Disegna un rettangolo sul gioco.
+ //samplo main_pass per riferimento.
+ vec4 pixel_Original = texture(Original,vTexCoord);
+
+ FragColor = pixel_Original;
+
+/*
+ float dist = 1-length(vTexCoord-0.5);
+
+ FragColor = vec4(main_wrap(),1.0);
+
+ float corner_size = 0.25;
+ float corner_smooth = 4.0;
+ float zoom = 0.4;
+ vec2 co = get_scaled_coords(zoomout_coords(vTexCoord, -zoom , 1.0),global.FinalViewportSize);
+ float ss=pow(mborder(co,1.0,corner_size, corner_smooth),2.0);
+
+ //ss = ss * smoothstep(shade_end,shade_start, vTexCoord.x);
+
+ FragColor = vec4(ss);
+
+
+ vec2 ccords = get_scaled_coords(vTexCoord,global.FinalViewportSize);
+ ccords = zoomout_coords(ccords,-BEZEL_INNER_ZOOM,1.0);
+ //FragColor = texture(Original,ccords)*ss;
+*/
+}
+
+
diff --git a/bezel/koko-aio/shaders/old_unused/ambi_mix_pass.slang b/bezel/koko-aio/shaders/old_unused/ambi_mix_pass.slang
new file mode 100644
index 0000000..cded680
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/ambi_mix_pass.slang
@@ -0,0 +1,61 @@
+#version 450
+#include "config.inc"
+
+#define eps 1e-8
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 1) out vec2 vOutputCoord;
+
+#include "functions.include"
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = get_scaled_coords(TexCoord);
+ vOutputCoord = TexCoord;
+}
+
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 1) in vec2 vOutputCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D final_pass;
+layout(set = 0, binding = 4) uniform sampler2D ambi_temporal_pass;
+
+#include "functions.include"
+
+vec4 pixel_border() {
+ vec3 ambi = texture(ambi_temporal_pass, vOutputCoord).rgb;
+ float l = length(ambi);
+ float sat = 1.25;
+ float bright = 1.25;
+ ambi = normalize( pow(ambi.rgb + vec3(eps), vec3(sat)))*l * bright ;
+ ambi*=bright;
+ return vec4(ambi,0.0);
+}
+
+vec3 ambi_noised() {
+ return pixel_border().rgb + random();
+}
+
+
+void main() {
+ vec4 psample = texture(final_pass, vOutputCoord);
+ if (DO_AMBILIGHT == 1) {
+ vec3 ambinoised = ambi_noised();
+ if (is_outer_frame(psample)) {
+ FragColor = mark_outer_frame(ambi_noised());
+ } else {
+ FragColor = vec4(mix(ambinoised.rgb,psample.rgb,min(psample.a*1.5,1.0)),psample.a);
+ }
+ } else {
+ FragColor = psample ;
+ }
+
+
+ //FragColor = vec4(ambi_noised(), 1.0);
+
+}
+
diff --git a/bezel/koko-aio/shaders/old_unused/ambi_passthrough_conditional.slang b/bezel/koko-aio/shaders/old_unused/ambi_passthrough_conditional.slang
new file mode 100644
index 0000000..e821877
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/ambi_passthrough_conditional.slang
@@ -0,0 +1,28 @@
+#version 450
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D Source;
+
+
+void main() {
+ if (DO_AMBILIGHT == 1.0)
+ FragColor = texture(Source, vTexCoord);
+ else
+ return;
+}
+
+
diff --git a/bezel/koko-aio/shaders/old_unused/bloom_passthrough_conditional.slang b/bezel/koko-aio/shaders/old_unused/bloom_passthrough_conditional.slang
new file mode 100644
index 0000000..1f1be2a
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/bloom_passthrough_conditional.slang
@@ -0,0 +1,36 @@
+#version 450
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D main_pass;
+
+
+void main() {
+ vec2 coords = vTexCoord;
+ if (DO_BLOOM == 1) {
+ if (DO_CURVATURE == 1.0) {
+ if ((GEOM_WARP_X > 0.0) || (GEOM_WARP_Y > 0.0))
+ coords = Warp(vTexCoord,GEOM_WARP_X,GEOM_WARP_Y);
+ }
+ FragColor = texture(main_pass,coords);
+ return;
+ } else {
+ //No bloom requested
+ return;
+ }
+}
+
+
diff --git a/bezel/koko-aio/shaders/old_unused/blurs.include.slang b/bezel/koko-aio/shaders/old_unused/blurs.include.slang
new file mode 100644
index 0000000..ce5bd4a
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/blurs.include.slang
@@ -0,0 +1,12 @@
+vec4 blur9(sampler2D image, vec2 uv, vec2 resolution, vec2 direction, float lod) {
+ vec4 color = vec4(0.0);
+ vec2 off1 = vec2(1.3846153846) * direction;
+ vec2 off2 = vec2(3.2307692308) * direction;
+ color += textureLod(image, uv, lod) * 0.2270270270;
+ color += textureLod(image, uv + (off1 / resolution), lod) * 0.3162162162;
+ color += textureLod(image, uv - (off1 / resolution), lod) * 0.3162162162;
+ color += textureLod(image, uv + (off2 / resolution), lod) * 0.0702702703;
+ color += textureLod(image, uv - (off2 / resolution), lod) * 0.0702702703;
+ return color;
+}
+
diff --git a/bezel/koko-aio/shaders/old_unused/curvature.slang b/bezel/koko-aio/shaders/old_unused/curvature.slang
new file mode 100644
index 0000000..5745c36
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/curvature.slang
@@ -0,0 +1,226 @@
+#version 450
+#include "config.inc"
+
+
+/*
+ CRT Shader by EasyMode
+ License: GPL
+
+ Modified by kokoko3k, stripped to keep just curvature related code.
+*/
+
+#define FIX(c) max(abs(c), 1e-5)
+#define PI 3.141592653589
+#define TEX2D(c) texture(tex, c)
+#define in_texture final_pass
+#define in_textureSize final_passSize
+//#define in_textureSize SourceSize
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 1) out vec2 vOutputCoord;
+
+#include "functions.include"
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = get_scaled_coords(TexCoord);
+ vOutputCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 1) in vec2 vOutputCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D in_texture;
+
+float curve_distance(float x, float sharp)
+{
+ float x_step = step(0.5, x);
+ float curve = 0.5 - sqrt(0.25 - (x - x_step) * (x - x_step)) * sign(0.5 - x);
+
+ return mix(x, curve, sharp);
+}
+
+mat4x4 get_color_matrix(sampler2D tex, vec2 co, vec2 dx)
+{
+ return mat4x4(TEX2D(co - dx), TEX2D(co), TEX2D(co + dx), TEX2D(co + 2.0 * dx));
+}
+
+vec4 filter_lanczos(vec4 coeffs, mat4x4 color_matrix)
+{
+ vec4 col = color_matrix * coeffs;
+ vec4 sample_min = min(color_matrix[1], color_matrix[2]);
+ vec4 sample_max = max(color_matrix[1], color_matrix[2]);
+
+ col = clamp(col, sample_min, sample_max);
+
+ return col;
+}
+
+vec2 curve_coordinate(vec2 co, float curvature_x, float curvature_y)
+{
+ vec2 curve = vec2(curvature_x, curvature_y);
+ vec2 co2 = co + co * curve - curve / 2.0;
+ vec2 co_weight = vec2(co.y, co.x) * 2.0 - 1.0;
+
+ co = mix(co, co2, co_weight * co_weight);
+
+ return co;
+}
+
+float get_corner_weight(vec2 co, vec2 corner, float smoothfunc)
+{
+ float corner_weight;
+
+ co = min(co, vec2(1.0) - co) * vec2(1.0, 0.75);
+ co = (corner - min(co, corner));
+ corner_weight = clamp((corner.x - sqrt(dot(co, co))) * smoothfunc, 0.0, 1.0);
+ corner_weight = mix(1.0, corner_weight, ceil(corner.x));
+
+ return corner_weight;
+}
+
+#define GEOM_ANTIALIAS 1.0
+
+vec3 curve_antialias(vec2 xy,vec2 tex_size){
+ vec2 midpoint = vec2(0.5, 0.5);
+
+ vec2 co = vOutputCoord * tex_size * params.in_textureSize.zw;
+ vec2 co2 = vTexCoord * tex_size * params.in_textureSize.zw;
+
+ vec3 col;
+ float corner_weight = get_corner_weight(curve_coordinate(co2, GEOM_BORDER_WX, GEOM_BORDER_WY ), vec2(GEOM_CORNER_SIZE), GEOM_CORNER_SMOOTH);
+
+ if ( (GEOM_WARP_X > 0) || (GEOM_WARP_Y > 0) ) {
+ xy *= params.in_textureSize.xy / tex_size;
+
+ vec2 dx = vec2(1.0 / tex_size.x, 0.0);
+ vec2 dy = vec2(0.0, 1.0 / tex_size.y);
+ vec2 pix_co = xy * tex_size - midpoint;
+ vec2 tex_co = (floor(pix_co) + midpoint) / tex_size;
+ vec2 dist = fract(pix_co);
+ float curve_x, curve_y;
+ vec3 col2, diff;
+
+ curve_x = curve_distance(dist.x, SHARPNESS_H * SHARPNESS_H);
+ curve_y = curve_distance(dist.y, SHARPNESS_V * SHARPNESS_V);
+
+ vec4 coeffs_x = PI * vec4(1.0 + curve_x, curve_x, 1.0 - curve_x, 2.0 - curve_x);
+ vec4 coeffs_y = PI * vec4(1.0 + curve_y, curve_y, 1.0 - curve_y, 2.0 - curve_y);
+
+ coeffs_x = FIX(coeffs_x);
+ coeffs_x = 2.0 * sin(coeffs_x) * sin(coeffs_x / 2.0) / (coeffs_x * coeffs_x);
+ coeffs_x /= dot(coeffs_x, vec4(1.0));
+
+ coeffs_y = FIX(coeffs_y);
+ coeffs_y = 2.0 * sin(coeffs_y) * sin(coeffs_y / 2.0) / (coeffs_y * coeffs_y);
+ coeffs_y /= dot(coeffs_y, vec4(1.0));
+
+ mat4x4 color_matrix;
+
+
+ color_matrix[0] = filter_lanczos(coeffs_x, get_color_matrix(in_texture, tex_co - dy, dx));
+ color_matrix[1] = filter_lanczos(coeffs_x, get_color_matrix(in_texture, tex_co, dx));
+ color_matrix[2] = filter_lanczos(coeffs_x, get_color_matrix(in_texture, tex_co + dy, dx));
+ color_matrix[3] = filter_lanczos(coeffs_x, get_color_matrix(in_texture, tex_co + 2.0 * dy, dx));
+
+ col = filter_lanczos(coeffs_y, color_matrix).rgb;
+ } else {
+ col = texture(in_texture, vOutputCoord).rgb;
+ }
+
+ col *= vec3(corner_weight);
+ return col;
+}
+
+vec2 Warp2(vec2 texCoord){
+
+ vec2 curvedCoords = texCoord * 2.0 - 1.0;
+ vec2 CRT_Distortion = vec2(GEOM_WARP_X, GEOM_WARP_Y) * 15.;
+ float curvedCoordsDistance = sqrt(curvedCoords.x*curvedCoords.x+curvedCoords.y*curvedCoords.y);
+
+ curvedCoords = curvedCoords / curvedCoordsDistance;
+
+ curvedCoords = curvedCoords * (1.0-pow(vec2(1.0-(curvedCoordsDistance/1.4142135623730950488016887242097)),(1.0/(1.0+CRT_Distortion*0.2))));
+
+ curvedCoords = curvedCoords / (1.0-pow(vec2(0.29289321881345247559915563789515),(1.0/(vec2(1.0)+CRT_Distortion*0.2))));
+
+ curvedCoords = curvedCoords * 0.5 + 0.5;
+ return curvedCoords;
+}
+
+vec3 do_curvature_antialias(){
+ vec2 tex_size = params.in_textureSize.xy ;
+
+ vec2 co = vOutputCoord * tex_size * params.in_textureSize.zw;
+ vec2 co2 = vTexCoord * tex_size * params.in_textureSize.zw;
+ vec2 curved_xy = curve_coordinate(co, GEOM_WARP_X,GEOM_WARP_Y );
+
+ vec3 col;
+ //float corner_weight = get_corner_weight(curve_coordinate(co2, GEOM_BORDER_WX, GEOM_BORDER_WY ), vec2(GEOM_CORNER_SIZE), GEOM_CORNER_SMOOTH);
+ float corner_weight = get_corner_weight(Warp2(co), vec2(GEOM_CORNER_SIZE), GEOM_CORNER_SMOOTH);
+
+
+ if ( (GEOM_WARP_X > 0) || (GEOM_WARP_Y > 0) ) {
+ if (GEOM_ANTIALIAS == 1.0)
+ col = curve_antialias(curved_xy,tex_size);
+ else
+ col = texture(in_texture,curved_xy).rgb;
+ } else {
+ col = texture(in_texture, vOutputCoord).rgb;
+ }
+
+ col *= vec3(corner_weight) ;
+
+
+
+ return col;
+}
+
+const vec2 corner_aspect = vec2(1.0, 0.75);
+
+float corner2(vec2 coord)
+{
+ coord = (coord - vec2(0.5)) + vec2(0.5, 0.5);
+ coord = min(coord, vec2(1.0) - coord) * corner_aspect;
+ vec2 cdist = vec2(GEOM_CORNER_SIZE);
+ coord = (cdist - min(coord, cdist));
+ float dist = sqrt(dot(coord, coord));
+
+ return clamp((cdist.x - dist)*GEOM_CORNER_SMOOTH, 0.0, 1.0);
+}
+
+
+
+
+
+vec3 do_curvature_alias(){
+ vec2 curved_xy = Warp2(vOutputCoord);
+ return texture(in_texture,curved_xy ).rgb * corner2(curved_xy);
+}
+
+vec4 main_wrap()
+{
+ if (DO_CURVATURE == 1.0) {
+ return vec4(do_curvature_antialias(), 1.0);
+ } else {
+ return texture(in_texture, vOutputCoord);
+ }
+}
+
+#include "functions.include"
+void main() {
+ vec4 psample = texture(in_texture, vOutputCoord);
+ if ( border_needed() ) {
+ if (is_outer_frame(psample))
+ FragColor = mark_outer_frame(vec3(0.0));
+ else
+ FragColor = main_wrap();
+ } else {
+ FragColor = main_wrap();
+ }
+}
+
+
diff --git a/bezel/koko-aio/shaders/old_unused/in_glow.slang b/bezel/koko-aio/shaders/old_unused/in_glow.slang
new file mode 100644
index 0000000..492b99f
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/in_glow.slang
@@ -0,0 +1,68 @@
+#version 450
+#include "config.inc"
+
+
+#define eps 1e-8
+#define pi 3.141592654
+
+
+// Blur sizes must not depend on input resolution
+#define scalemod_x (params.SourceSize.x/360.0)
+#define scalemod_y (params.SourceSize.y/270.0)
+
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 1) out vec2 vOutputCoord;
+
+
+#include "functions.include"
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord ; //get_scaled_coords(TexCoord);
+ vOutputCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 1) in vec2 vOutputCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D FXAA_pass;
+layout(set = 0, binding = 3) uniform sampler2D doublesize_pass;
+
+// What follows is an ugly optimization with a lot of code copied and pasted repeated multiple times,
+// shamlessly hidden into an include:
+#include "pixel_glows.slang"
+
+
+#include "functions.include"
+
+vec4 main_wrap(void) {
+ //Halo
+ vec2 in_glow_coords = vTexCoord;
+ if (DO_CURVATURE == 1.0) {
+ if ((GEOM_WARP_X > 0.0) || (GEOM_WARP_Y > 0.0))
+ in_glow_coords = Warp(vTexCoord,GEOM_WARP_X,GEOM_WARP_Y);
+ }
+ vec3 pixel_glowed;
+ if (DO_FXAA == 1.0)
+ pixel_glowed = pixel_glow(FXAA_pass, in_glow_wh,in_glow_wh,in_glow_power,in_glow_gamma,in_glow_coords, global.FXAA_passSize, global.FXAA_passSize).rgb;
+ else
+ pixel_glowed = pixel_glow(doublesize_pass, in_glow_wh,in_glow_wh,in_glow_power,in_glow_gamma,in_glow_coords, global.FXAA_passSize, global.FXAA_passSize).rgb;
+
+ return vec4(pixel_glowed.rgb,1.0);
+ //Out
+ return vec4(vec3(0.0),1.0);
+}
+
+
+
+void main() {
+ if (DO_IN_GLOW == 1.0 ) {
+ FragColor = main_wrap();
+ } else {
+ return;
+ }
+}
diff --git a/bezel/koko-aio/shaders/old_unused/main_pass.slang b/bezel/koko-aio/shaders/old_unused/main_pass.slang
new file mode 100644
index 0000000..f166fb8
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/main_pass.slang
@@ -0,0 +1,323 @@
+#version 450
+#include "config.inc"
+#define half_pi 1.5707963267949
+
+// RGB mask: R G B
+ #define m1 vec3 ( 1.0 , 0.0 , 0.0 ) //col 1
+ #define m2 vec3 ( 0.0 , 1.0 , 0.0 ) //col 2
+ #define m3 vec3 ( 0.0 , 0.0 , 1.0 ) //col 3
+
+// RGB mask low dpi (green-magenta, exploiting native rgb subpixels)
+ #define m1gm vec3 ( 0.0 , 1.0 , 0.0 ) //col 1
+ #define m2gm vec3 ( 1.0 , 0.0 , 1.0 ) //col 2
+
+// Blur sizes must not depend on input resolution
+#define scalemod_x (global.in_glow_passSize.x/360.0)
+#define scalemod_y (global.in_glow_passSize.y/270.0)
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+layout(location = 1) out vec2 vOutputCoord;
+
+#include "includes/functions.include.slang"
+void main() {
+ gl_Position = global.MVP * Position;
+ vTexCoord = get_scaled_coords(TexCoord,global.FinalViewportSize, is_rotated());
+ vOutputCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 1) in vec2 vOutputCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 3) uniform sampler2D FXAA_pass;
+layout(set = 0, binding = 4) uniform sampler2D in_glow_pass;
+layout(set = 0, binding = 5) uniform sampler2D halo_pass;
+layout(set = 0, binding = 6) uniform sampler2D first_pass;
+layout(set = 0, binding = 7) uniform sampler2D avglum_passFeedback;
+
+
+#include "includes/functions.include.slang"
+vec3 pixel_vmask(vec3 source, vec3 white_reference, float over_white) {
+ int col = int( vOutputCoord.x * params.OutputSize.x );
+ vec3 pixel_out;
+ vec3 vmasked;
+ vec4 vec_mod=(vec4(3,1,2,3) + vec4(VMASK_GAP,0.0,0.0,0.0))* VMASK_DARKLINE_SCALE ;
+ float mask_lightness = 1.0 - RGB_MASK_STRENGTH;
+ if ( mod(col, vec_mod.x) < vec_mod.y) vmasked = min(m1 + mask_lightness,vec3(1.0)) * source;
+ else if (mod(col, vec_mod.x) < vec_mod.z) vmasked = min(m2 + mask_lightness,vec3(1.0)) * source;
+ else if (mod(col, vec_mod.x) < vec_mod.w) vmasked = min(m3 + mask_lightness,vec3(1.0)) * source;
+ else vmasked = min(vec3(0.0) + mask_lightness,vec3(1.0)) * source;
+
+ if (over_white == 1.0) pixel_out = vmasked;
+ else {
+ float whiteness=(white_reference.r+white_reference.g+white_reference.b)/3.0;
+ whiteness-= over_white;
+ whiteness= clamp(whiteness,0.0,1.0);
+ pixel_out= mix(vmasked,source,whiteness);
+ }
+ return pixel_out;
+}
+
+vec3 pixel_vmask_gm(vec3 source, vec3 white_reference, float over_white) {
+ int col = int( vOutputCoord.x * params.OutputSize.x );
+ vec3 pixel_out;
+ vec3 vmasked;
+ vec3 vec_mod=(vec3(2,1,2) + vec3(VMASK_GAP,0.0,0.0))* VMASK_DARKLINE_SCALE ;
+
+ float mask_lightness = 1.0 - RGB_MASK_STRENGTH;
+ if (mod(col, vec_mod.x) < vec_mod.y) vmasked = min(m1gm + mask_lightness,vec3(1.0)) * source;
+ else if (mod(col, vec_mod.x) < vec_mod.z) vmasked = min(m2gm + mask_lightness,vec3(1.0)) * source;
+ else vmasked = min(vec3(0.0) + mask_lightness,vec3(1.0)) * source;
+
+ if (over_white == 1.0) pixel_out = vmasked;
+ else {
+ float whiteness=(white_reference.r+white_reference.g+white_reference.b)/3.0;
+ whiteness-= over_white;
+ whiteness= clamp(whiteness,0.0,1.0);
+ pixel_out= mix(vmasked,source,whiteness);
+ }
+
+ return pixel_out;
+}
+
+vec3 pixel_darklines(vec3 source,float darkline_every, float darkline_trans,
+ float do_offset, vec3 white_reference,float over_white) {
+
+ float Darkline_part_w = (3.0 - VMASK_USE_GM + VMASK_GAP) * VMASK_DARKLINE_SCALE;
+ float Darkline_part_w_x2 = Darkline_part_w*2;
+ //vec3 pixel_out=source;
+ float col_2 = vOutputCoord.x * params.OutputSize.x;
+ float line_2 = vOutputCoord.y * params.OutputSize.y;
+
+ darkline_every *= VMASK_DARKLINE_SCALE;
+
+ if (over_white != 1.0) {
+ //less effect on bright colors.
+ float whiteness=(white_reference.r+white_reference.g+white_reference.b)/3.0;
+ darkline_trans+=(whiteness-over_white);
+ darkline_trans=clamp(darkline_trans,0.0,1.0);
+ }
+
+ if (do_offset == 1.0) {
+ if (int(mod(line_2, darkline_every)) < VMASK_DARKLINE_SCALE) {
+ if (int(mod(col_2, Darkline_part_w_x2)) < Darkline_part_w) return source * darkline_trans;
+ } else if (int(mod(line_2+(darkline_every/2), darkline_every)) < VMASK_DARKLINE_SCALE ) {
+ // DRAW WITH OFFSET:
+ col_2+=Darkline_part_w;
+ if ((int(mod(col_2, Darkline_part_w_x2))) < Darkline_part_w)
+ return source * darkline_trans;
+ }
+ } else {
+
+ if ( darkline_every >= 0.0)
+ if (int(mod(line_2, darkline_every)) < VMASK_DARKLINE_SCALE) return source * darkline_trans;
+ }
+ return source;
+}
+
+/*
+float scanline_shape_static_in_lum(vec2 coords, float in_luminance) {
+ // Modulate scanline weight via in_luminance
+ float period = (params.OriginalSize.y > MIN_LINES_INTERLACED ) ? 2 : 1 ;
+ float angle = coords.y * pi * period * params.OriginalSize.y ;
+ float lines = abs(sin(angle));
+ lines=clamp(lines, SCANLINE_DARK,1.0);
+ lines = (lines*lines);
+ float w = (SCANLINES_BLEEDING * 9.0 * in_luminance +1 ); // + SCANLINES_BLEEDING;
+ lines = pow(lines,1.0/ w );
+ return lines;
+}
+*/
+
+/*
+ float scanline_shape_dumb(vec2 coords, bool do_flicker) {
+ float source_dy = global.first_passSize.w ;
+ if ( mod(coords.y, source_dy*2) < source_dy ) {
+ return 1.0;
+ }
+ return 0.0;
+}
+*/
+
+float scanline_shape(vec2 coords, bool do_flicker) {
+ bool alternate = false;
+ float period = 1.0;
+
+ int slow = 1;
+
+ if (do_flicker) {
+ if (params.FrameCount/slow % 2 == 0.0) alternate = true;
+ if (params.OriginalSize.y > MIN_LINES_INTERLACED ) period = 0.5;
+ }
+
+ float angle = coords.y * pi * params.OriginalSize.y * period;
+
+ float lines;
+ if (alternate)
+ lines = -sin(angle+half_pi); //lines = abs(cos(angle));
+ else
+ lines = sin(angle);
+ lines = (lines*lines);
+
+ if (SCANLINE_DARK >= 0.0) {
+ lines = lines * (1.0 - SCANLINE_DARK) + SCANLINE_DARK;
+ } else {
+ float deepness = -SCANLINE_DARK;
+ lines = lines * ((1-SCANLINE_DARK) ) + SCANLINE_DARK ;
+ }
+
+ return lines;
+}
+
+vec4 main_wrap(vec2 co) {
+ bool isinterlaced = is_interlaced();
+ bool flickering_scanlines = (DO_SCANLINES == 1.0) && scanline_have_to_flicker(isinterlaced) ;
+
+
+ vec3 pixel_in;
+ vec3 pixel_glowed;
+
+ //Get the first available pixel_in:
+ if (DO_IN_GLOW == 1.0) {
+ pixel_glowed = texture(in_glow_pass,co).rgb;
+ pixel_in = pixel_glowed;
+ }
+ else if (DO_FXAA == 1.0)
+ pixel_in = texture(FXAA_pass,co).rgb ;
+ else
+ pixel_in = texture(first_pass,co).rgb ;
+
+ vec3 pixel_out = pixel_in;
+ vec3 pixel_in_clamped = min(pixel_in,vec3(1.0)); //Clamp here for moth vmask and darklines.
+
+ //Mask and darklines:
+ if (DO_VMASK_AND_DARKLINES == 1.0 ) {
+ if (RGB_MASK_STRENGTH > 0.0) {
+ //Use RGB pattern or exploit RGB layout with green and magenta?
+ if (VMASK_USE_GM < 1.0) {
+ pixel_out = pixel_vmask(pixel_in, pixel_in_clamped, VMASK_OVERWHITE);
+ } else {
+ pixel_out = pixel_vmask_gm(pixel_in, pixel_in_clamped, VMASK_OVERWHITE);
+ }
+ }
+ //Screen lines
+ if (DARKLINES_STRENGTH > 0.0 ) {
+ float MYDARKLINES_TRANSPARENCY = 1.0 - DARKLINES_STRENGTH;
+ pixel_out = pixel_darklines(pixel_out,DARKLINES_PERIOD,MYDARKLINES_TRANSPARENCY,DO_DARKLINES_VOFFSET,pixel_in_clamped,DRKLN_OVERWHITE);
+ }
+
+ }
+
+ //Halo
+ vec3 pixel_haloed;
+ if (DO_HALO == 1.0 ) {
+ pixel_haloed = texture(halo_pass,co).rgb;
+ pixel_out += pixel_haloed;
+ pixel_out = clamp(pixel_out,0.0,HALO_CLAMP);
+ }
+
+ // Non flickering scanlines
+ if ( DO_SCANLINES == 1.0 ) {
+ vec3 pixel_bleed ;
+ if (! ( isinterlaced && (SCANLINE_DISABLE_ON_INTERLACE == 1.0)) ) {
+ if (DO_IN_GLOW + DO_HALO > 0.0) {
+ if (DO_HALO == 1.0) pixel_bleed = pixel_haloed;
+ else if (DO_IN_GLOW == 1.0) pixel_bleed = pixel_glowed;
+ else pixel_bleed = pixel_in;
+ }
+
+ float scanline_shape = scanline_shape(co, flickering_scanlines ) ;
+ vec3 pixel_scanlined = scanline_shape * pixel_out;
+
+ pixel_out = pixel_scanlined + (pixel_out * pixel_bleed * SCANLINES_BLEEDING * (1-scanline_shape));
+ }
+ }
+
+ if (DO_CCORRECTION == 1.0) pixel_out = pow(pixel_out,vec3(GAMMA_OUT));
+
+ //Out
+ return vec4(pixel_out,1.0) ; //* border(border_coords);
+}
+
+/*
+//Test masks to be used with pixel_vmask_test()
+// Actually slower than pixel_vmask(), but handy for quick test
+ //first element of the array is the useful size.
+ const vec3 oo = vec3(0); //padding
+ const vec3 mask_RGB[10] = vec3[]( vec3(3), vec3(1,0,0), vec3(0,1,0), vec3(0,0,1), oo, oo, oo, oo, oo, oo);
+ const vec3 mask_GM[10] = vec3[]( vec3(2), vec3(0,1,0), vec3(1,0,1), oo, oo, oo, oo, oo, oo, oo);
+
+
+vec3 pixel_vmask_test(vec3 color_in, vec3[10] vmask, int multiplier, float gap, vec3 white_reference, float over_white) {
+ int col = int( vOutputCoord.x * params.OutputSize.x );
+ vec3 vmasked;
+
+ float size = (vmask[0].x + gap) * multiplier;
+
+ for (int i = multiplier ; i <= size * multiplier ; i+=multiplier) {
+ if (mod(col, size) < i) {
+ vmasked = min (vmask[i/multiplier] + 1.0 - RGB_MASK_STRENGTH, vec3(1.0)) * color_in;
+ break;
+ }
+ }
+
+ if (over_white == 1.0) return vmasked;
+ else {
+ float whiteness=(white_reference.r+white_reference.g+white_reference.b)/3.0;
+ whiteness-= over_white;
+ whiteness= clamp(whiteness,0.0,1.0);
+ return mix(vmasked, color_in, whiteness);
+ }
+
+}
+*/
+
+
+void main() {
+ vec2 coords = vTexCoord;
+
+ if (DO_DYNZOOM == 1.0) {
+ float zoomin = 1.0 + (texture(avglum_passFeedback, vec2(0.25,0.25) ).a/ DYNZOOM_FACTOR);
+ coords = zoom(vTexCoord, zoomin);
+ }
+
+ vec2 coords_curved = coords;
+
+ //Curvature: set coords_curved coordinate: (global var)
+ if (DO_CURVATURE == 1.0) {
+ if ((GEOM_WARP_X > 0.0) || (GEOM_WARP_Y > 0.0))
+ coords_curved = Warp(coords_curved,GEOM_WARP_X,GEOM_WARP_Y);
+ }
+
+ if (DO_BEZEL == 1.0) {
+ coords_curved = zoomout_coords(coords_curved, -BEZEL_INNER_ZOOM , 1.0);
+ coords = zoomout_coords(coords, -BEZEL_INNER_ZOOM , 1.0);
+ }
+
+ //FIXME: bezel may need a wider border when zoomed in.
+ //But for performance reasons we can wide the border in relation to the desidered reflection area.
+ //by now, just wide by BEZEL_REFLECTION_AREA_SIZE defined in config.inc
+
+ bool is_border = false;
+
+ if (border_needed()) {
+
+ float WIDEN = DO_BEZEL * BEZEL_REFLECTION_AREA_SIZE;
+ bool b_is_rotated = is_rotated();
+ bool is_outside_x = ((coords.x > 1.0+WIDEN ) || (coords.x < 0.0 - WIDEN) );
+ bool is_outside_y = ((coords.y > 1.0+WIDEN ) || (coords.y < 0.0 - WIDEN) );
+ is_border = (b_is_rotated && is_outside_y) || (!b_is_rotated && is_outside_x);
+ }
+
+ if (is_border)
+ FragColor = mark_outer_frame(vec3(0.0));
+ else
+ FragColor = main_wrap(coords_curved);
+
+
+}
+
+
diff --git a/bezel/koko-aio/shaders/old_unused/passthrough.slang b/bezel/koko-aio/shaders/old_unused/passthrough.slang
new file mode 100644
index 0000000..79c8384
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/passthrough.slang
@@ -0,0 +1,25 @@
+#version 450
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D Source;
+
+
+void main() {
+ FragColor = texture(Source, vTexCoord);
+}
+
+
diff --git a/bezel/koko-aio/shaders/old_unused/passthrough_original.slang b/bezel/koko-aio/shaders/old_unused/passthrough_original.slang
new file mode 100644
index 0000000..5d5c2e5
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/passthrough_original.slang
@@ -0,0 +1,36 @@
+#version 450
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D Original;
+
+
+void main() {
+ FragColor = vec4(texture(Original, vTexCoord).xyz,1.0);
+
+ /* //Use to debug:
+ vec4 pixel;
+ //pixel=vec4(abs(sin(params.FrameCount/3.14/20))); //white fade
+ //pixel=vec4(abs(sin(params.FrameCount/3.14/20)),0.0,0.0,0.0); //red fade
+ //pixel=vec4(0.2);
+ if (mod(params.FrameCount,100) == 0.0) {
+ pixel = vec4(0.6);
+ } else {
+ pixel = vec4(0.0);
+ }
+ FragColor = pixel;
+*/
+}
diff --git a/bezel/koko-aio/shaders/old_unused/scanline-flickering.slang b/bezel/koko-aio/shaders/old_unused/scanline-flickering.slang
new file mode 100644
index 0000000..02f75ec
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/scanline-flickering.slang
@@ -0,0 +1,103 @@
+#version 450
+
+#include "config.inc"
+
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+
+}
+
+
+#pragma stage fragment
+
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D in_glow_pass;
+layout(set = 0, binding = 3) uniform sampler2D FXAA_pass;
+layout(set = 0, binding = 4) uniform sampler2D doublesize_pass;
+
+
+bool scanline_have_to_flicker(bool is_interlaced) {
+ return ((scanline_flickering == 1.0) || ((scanline_flickering==2.0) && is_interlaced ));
+}
+
+void main()
+{
+
+ vec3 pixel_out = vec3(0.0);
+
+ //Use to debug:
+ //pixel_out=vec4(abs(sin(params.FrameCount/3.14/20))); //white fade
+ //pixel_out=vec4(abs(sin(params.FrameCount/3.14/20)),0.0,0.0,0.0); //red fade
+ //pixel_out=vec4(0.2);
+
+ if (DO_SCANLINES == 1.0) {
+ if (scanline_flickering != 0.0) {
+
+ bool is_interlaced = (params.OriginalSize.y > MIN_LINES_INTERLACED) ? true : false ;
+
+ if ( scanline_have_to_flicker(is_interlaced) ) {
+
+ //Choose the right source
+ if (DO_IN_GLOW == 1.0) {
+ pixel_out = texture(in_glow_pass, vTexCoord).rgb;
+ } else if (DO_FXAA == 1.0) {
+ pixel_out = texture(FXAA_pass, vTexCoord).rgb;
+ } else {
+ pixel_out = texture(doublesize_pass, vTexCoord).rgb;
+ }
+
+ int scanline_period;
+ int scanline_period_half;
+
+ /* Puae switches from lowres to sdres on interlaced screens
+ since we blindly double the h-resolution, because we need
+ to double y resolution on low resolution to simulate scanlines
+ and providing sd-res to fxaa, we can check if a screen is
+ interlaced by testing v-resolution of source image.
+ which could be at least 200*2(puae)*2(ourselves)=800px.
+ Rest assured that everything over 576,
+ (maximum pal overscanned) is interlaced.
+ */
+ if (is_interlaced) {
+ scanline_period=4;
+ scanline_period_half=2;
+ } else {
+ scanline_period=2;
+ scanline_period_half=1;
+ }
+
+ //Skip scanlines on interlaced content?
+ if (! ( is_interlaced && (scanline_disable_on_interlace == 1.0)) ) {
+
+ float mymod = mod(vTexCoord.y * params.OutputSize.y , scanline_period);
+
+ //Do flickering based on user prefs.
+ //(blank odd lines on odd frames and even lines on even frames)
+ if ((scanline_flickering == 1.0) ||
+ ((scanline_flickering==2.0) && is_interlaced )) {
+ if (int(mod(float(params.FrameCount),2 )) < 1.0 ) {
+ if (mymod >= scanline_period_half) { pixel_out *= SCANLINE_DARK; }
+ } else {
+ if (mymod < scanline_period_half) { pixel_out *= SCANLINE_DARK; }
+ }
+ }
+
+ }
+ }
+ }
+ }
+
+ FragColor = vec4(pixel_out,1.0);
+
+}
+
diff --git a/bezel/koko-aio/shaders/old_unused/vignette_and_spot.slang b/bezel/koko-aio/shaders/old_unused/vignette_and_spot.slang
new file mode 100644
index 0000000..2431463
--- /dev/null
+++ b/bezel/koko-aio/shaders/old_unused/vignette_and_spot.slang
@@ -0,0 +1,49 @@
+#version 450
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+#include "functions.include"
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+ float aspect_prev = (params.SourceSize.y / params.SourceSize.x);
+ if (border_needed() ) {
+ vTexCoord.x = vTexCoord.x * aspect_prev - ((0.5 * aspect_prev) - 0.5);
+ float in_aspect = get_in_aspect();
+ vTexCoord.x = vTexCoord.x * in_aspect - ((0.5 * in_aspect) - 0.5);
+ } else {
+ vTexCoord.x = vTexCoord.x * aspect_prev - ((0.5 * aspect_prev) - 0.5);
+ float dasp = global.FinalViewportSize.x/global.FinalViewportSize.y;
+ vTexCoord.x = (vTexCoord.x* dasp - ((0.5 * dasp) - 0.5)) ;
+ }
+}
+
+
+
+
+
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D Source;
+
+#include "functions.include"
+void main() {
+ if ((DO_VIGNETTE != 1.0) && (DO_SPOT != 1.0)) return;
+
+ vec3 pixel_out;
+ if (DO_VIGNETTE == 1.0)
+ pixel_out.r = gauss_xy(0.0, 0.0, v_size, v_power, 0.0, 1.0);
+ if (DO_SPOT == 1.0)
+ pixel_out.g = gauss_xy(s_center_x, s_center_y, s_size, s_power, 0.0, 10.0);
+
+ FragColor = vec4(pixel_out,1.0);
+}
+
+
diff --git a/bezel/koko-aio/shaders/reflection_blur_h.slang b/bezel/koko-aio/shaders/reflection_blur_h.slang
new file mode 100644
index 0000000..90e354b
--- /dev/null
+++ b/bezel/koko-aio/shaders/reflection_blur_h.slang
@@ -0,0 +1,114 @@
+#version 450
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+
+layout(location = 0) out vec2 vTexCoord;
+
+
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 1) uniform sampler2D first_pass;
+layout(set = 0, binding = 2) uniform sampler2D isrotated_passFeedback;
+
+#define SourceTexture first_pass
+#define SourceTextureSize global.first_passSize
+
+#include "includes/functions.include.slang"
+
+#define c_tolerance 0.051
+
+#define b_offset_x -0.05
+#define Pi2 6.28318530717959
+
+vec3 blur(float Quality, float Directions, float Size, vec2 co,float lod) {
+ vec4 iResolution = SourceTextureSize;
+ vec2 Radius = Size/iResolution.xy ;
+
+ vec3 color = vec3(0.0,0.0,0.0);
+ vec3 lookup = vec3(0.0,0.0,0.0);
+ float steps=0.0;
+ for( float d=0.0; d 4.0) return vec3(1.0);
+
+ return color;
+}
+
+void main() {
+ if (DO_BEZEL == 0.0) return;
+
+ vec2 coords_curved = vTexCoord;
+ if (DO_CURVATURE == 1.0) {
+ if ((GEOM_WARP_X > 0.0) || (GEOM_WARP_Y > 0.0))
+ coords_curved = Warp(coords_curved,GEOM_WARP_X,GEOM_WARP_Y);
+ }
+ //coords_curved = zoomout_coords(coords_curved, -BEZEL_INNER_ZOOM , 1.0);
+ coords_curved = zoomout_coords(coords_curved, BEZEL_REFLECTION_AREA_SIZE , 1.0);
+
+ bool is_rotated = texture(isrotated_passFeedback,vec2(0.5,0.5)).r > 0.5;
+
+
+ /* Calculate the internal area (the one which is not mirrored)
+ so that we can skip blurring it:
+ */
+ /* vec2 ar_box;
+ if (!is_rotated) {
+ //Width of the aspect corrected box zoomed as requested by the bezel settings:
+ ar_box.x = global.FinalViewportSize.z*global.FinalViewportSize.y*get_in_aspect() * (1+BEZEL_INNER_ZOOM-c_tolerance) ;
+ //Height zoomed as requested by bezel settings:
+ ar_box.y = 1+BEZEL_INNER_ZOOM-c_tolerance;
+ } else {
+ ar_box.y = global.FinalViewportSize.z*global.FinalViewportSize.y/get_in_aspect() * (1+BEZEL_INNER_ZOOM-c_tolerance) ;
+ ar_box.x= 1+BEZEL_INNER_ZOOM-c_tolerance;
+ }
+
+ //start_point is the middle of the screen minut half the content width
+ vec2 start_point = vec2(0.5 - (ar_box.x*0.5), 0.5 - (ar_box.y*0.5));
+ vec2 end_point = vec2(0.5 + (ar_box.x*0.5), 0.5 + (ar_box.y*0.5));
+
+
+ //Now we can skip the internal area or the black one as already marked by main_pass:
+ //bool skip_condition =(vTexCoord.x > start_point.x && vTexCoord.x < end_point.x &&
+ // vTexCoord.y > start_point.y && vTexCoord.y < end_point.y) ||
+ // is_outer_frame(texture(main_pass,vTexCoord));
+
+ */
+
+ //FIXME (CHECKME) is the rotation state still important?
+
+ bool skip_condition = (coords_curved.x < 1.0 - c_tolerance && coords_curved.x > c_tolerance &&
+ coords_curved.y < 1.0 - c_tolerance && coords_curved.y > c_tolerance ) ;
+
+ if (skip_condition) {
+ FragColor = mark_useless(vec3(0.0));
+ return;
+ }
+
+ vec2 res = vec2(global.first_passSize.x, global.first_passSize.y);
+ vec2 dir = vec2(1.0,0.0);
+ ///Quality, Directions, Size, coords, lod
+ vec3 pixel_blur = blur(1,4,2,coords_curved, 2.0);
+
+ FragColor = vec4(apply_fuzzy_main_pass(pixel_blur),1.0);
+
+}
+
+
+
diff --git a/bezel/koko-aio/shaders/reflection_blur_v.slang b/bezel/koko-aio/shaders/reflection_blur_v.slang
new file mode 100644
index 0000000..325e460
--- /dev/null
+++ b/bezel/koko-aio/shaders/reflection_blur_v.slang
@@ -0,0 +1,56 @@
+#version 450
+#include "config.inc"
+
+#pragma stage vertex
+layout(location = 0) in vec4 Position;
+layout(location = 1) in vec2 TexCoord;
+layout(location = 0) out vec2 vTexCoord;
+
+void main()
+{
+ gl_Position = global.MVP * Position;
+ vTexCoord = TexCoord;
+}
+
+#pragma stage fragment
+layout(location = 0) in vec2 vTexCoord;
+layout(location = 0) out vec4 FragColor;
+layout(set = 0, binding = 2) uniform sampler2D Source;
+
+#include "includes/functions.include.slang"
+
+#define SourceTexture Source
+#define SourceTextureSize params.SourceSize
+
+#define b_offset_x -0.05
+#define Pi2 6.28318530717959
+vec3 blur(float Quality, float Directions, float Size, vec2 co) {
+ vec4 iResolution = SourceTextureSize;
+ vec2 Radius = Size/iResolution.xy ;
+ vec3 color = vec3(0.0,0.0,0.0);
+ vec3 lookup = vec3(0.0,0.0,0.0);
+ float steps=0.0;
+ for( float d=0.0; d 1.0) {
+ vec3 pixel_out = pixel_offset_wrap(vTexCoord);
+ if (DO_SAT_BLEED > 0.0) {
+ if ( DO_FXAA == 1.0) {
+ pixel_out = pixel_bleed(pixel_out, vTexCoord, FXAA_pass, global.FXAA_passSize);
+ } else {
+ pixel_out = pixel_bleed(pixel_out, vTexCoord, first_pass, global.first_passSize);
+ }
+ }
+ FragColor = vec4(pixel_out,0.0);
+ return;
+ }
+
+ //Handle case where only color shifting is requested
+ if (DO_SHIFT_RGB > 0.0) {
+ vec3 pixel_out = pixel_offset_wrap(vTexCoord);
+ FragColor = vec4(pixel_out,0.0);
+ return;
+ }
+
+ //Handle case where only chroma bleed is requested
+ if (DO_SAT_BLEED > 0.0) {
+ vec3 pixel_out;
+ if ( DO_FXAA == 1.0) {
+ pixel_out = texture(FXAA_pass, vTexCoord).rgb;
+ pixel_out = pixel_bleed(pixel_out, vTexCoord, FXAA_pass, global.FXAA_passSize);
+ } else {
+ pixel_out = texture(first_pass, vTexCoord).rgb;
+ pixel_out = pixel_bleed(pixel_out, vTexCoord, first_pass, global.first_passSize);
+ }
+ FragColor = vec4(pixel_out,0.0);
+ return;
+ }
+
+
+}
diff --git a/bezel/koko-aio/textures/background_over.png b/bezel/koko-aio/textures/background_over.png
new file mode 100644
index 0000000..40f9263
Binary files /dev/null and b/bezel/koko-aio/textures/background_over.png differ
diff --git a/bezel/koko-aio/textures/background_under.png b/bezel/koko-aio/textures/background_under.png
new file mode 100644
index 0000000..fd5f218
Binary files /dev/null and b/bezel/koko-aio/textures/background_under.png differ
diff --git a/bezel/koko-aio/textures/monitor_body.png b/bezel/koko-aio/textures/monitor_body.png
new file mode 100644
index 0000000..2af0c79
Binary files /dev/null and b/bezel/koko-aio/textures/monitor_body.png differ
diff --git a/bezel/koko-aio/textures/monitor_body_source/monitor_body.7z b/bezel/koko-aio/textures/monitor_body_source/monitor_body.7z
new file mode 100644
index 0000000..9985996
Binary files /dev/null and b/bezel/koko-aio/textures/monitor_body_source/monitor_body.7z differ
diff --git a/bezel/koko-aio/textures/other_backgrounds_under/background1.png b/bezel/koko-aio/textures/other_backgrounds_under/background1.png
new file mode 100644
index 0000000..fd5f218
Binary files /dev/null and b/bezel/koko-aio/textures/other_backgrounds_under/background1.png differ
diff --git a/bezel/koko-aio/textures/other_backgrounds_under/background2.png b/bezel/koko-aio/textures/other_backgrounds_under/background2.png
new file mode 100644
index 0000000..39d0ddc
Binary files /dev/null and b/bezel/koko-aio/textures/other_backgrounds_under/background2.png differ
diff --git a/bezel/koko-aio/textures/other_backgrounds_under/background3.png b/bezel/koko-aio/textures/other_backgrounds_under/background3.png
new file mode 100644
index 0000000..1742746
Binary files /dev/null and b/bezel/koko-aio/textures/other_backgrounds_under/background3.png differ
diff --git a/bezel/koko-aio/tv-BASE.slangp b/bezel/koko-aio/tv-BASE.slangp
new file mode 100644
index 0000000..ec49aa1
--- /dev/null
+++ b/bezel/koko-aio/tv-BASE.slangp
@@ -0,0 +1,245 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+TEMPERATURE = "7000.000000"
+GAMMA_OUT = "0.550000"
+DO_FXAA = "1.000000"
+DO_SHIFT_RGB = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_PAL = "1.000000"
+SAT_BLEED_STRENGTH = "0.500000"
+SAT_BLEED_SIZE_LEFT = "3.000000"
+SAT_BLEED_SIZE_RIGHT = "3.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.600000"
+IN_GLOW_WH = "3.500000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+DARKLINES_STRENGTH = "0.700000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.520000"
+HALO_W = "3.000000"
+HALO_H = "3.000000"
+HALO_GAMMA = "1.100000"
+DO_SCANLINES = "1.000000"
+SCANLINE_DARK = "0.700000"
+SCANLINE_COMPENSATION = "0.200000"
+SCANLINES_BLEEDING = "1.000000"
+SCANLINE_FLICKERING = "0.000000"
+SCANLINE_FLICKERING_POWER = "0.500000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.000000"
+GEOM_CORNER_SMOOTH = "200.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/tv-NTSC.slangp b/bezel/koko-aio/tv-NTSC.slangp
new file mode 100644
index 0000000..68851ed
--- /dev/null
+++ b/bezel/koko-aio/tv-NTSC.slangp
@@ -0,0 +1,251 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.200000"
+CONTRAST = "0.050000"
+BRIGHTNESS = "0.050000"
+TEMPERATURE = "7000.000000"
+GAMMA_OUT = "0.560000"
+DO_SHIFT_RGB = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "2.000000"
+SHIFT_G = "20.000000"
+SHIFT_B = "-2.000000"
+DO_SAT_BLEED = "1.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.750000"
+IN_GLOW_WH = "1.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+DARKLINES_STRENGTH = "0.700000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.500000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.150000"
+DO_SCANLINES = "1.000000"
+SCANLINE_DARK = "0.300000"
+SCANLINES_BLEEDING = "0.825000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.500000"
+GEOM_WARP_Y = "0.500000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_INNER_ZOOM = "-0.005000"
+BEZEL_FRAME_ZOOM = "0.139000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "5.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/tv-aperturegrille-bloom-bezel.slangp b/bezel/koko-aio/tv-aperturegrille-bloom-bezel.slangp
new file mode 100644
index 0000000..2f92c40
--- /dev/null
+++ b/bezel/koko-aio/tv-aperturegrille-bloom-bezel.slangp
@@ -0,0 +1,251 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+TEMPERATURE = "7000.000000"
+GAMMA_OUT = "0.350000"
+DO_FXAA = "1.000000"
+DO_SHIFT_RGB = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_PAL = "1.000000"
+SAT_BLEED_STRENGTH = "0.500000"
+SAT_BLEED_SIZE_LEFT = "3.000000"
+SAT_BLEED_SIZE_RIGHT = "3.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.750000"
+IN_GLOW_WH = "3.500000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+DARKLINES_STRENGTH = "1.000000"
+DO_DARKLINES_VOFFSET = "0.000000"
+DARKLINES_PERIOD = "2.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.350000"
+HALO_W = "3.000000"
+HALO_H = "3.000000"
+SCANLINE_DARK = "0.700000"
+SCANLINE_COMPENSATION = "0.200000"
+SCANLINES_BLEEDING = "1.000000"
+SCANLINE_FLICKERING = "0.000000"
+SCANLINE_FLICKERING_POWER = "0.500000"
+DO_BLOOM = "1.000000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.800000"
+GEOM_WARP_Y = "0.850000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.600000"
+AMBI_POWER = "2.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/tv-aperturegrille-bloom-bezelwider.slangp b/bezel/koko-aio/tv-aperturegrille-bloom-bezelwider.slangp
new file mode 100644
index 0000000..6035478
--- /dev/null
+++ b/bezel/koko-aio/tv-aperturegrille-bloom-bezelwider.slangp
@@ -0,0 +1,253 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+TEMPERATURE = "7000.000000"
+GAMMA_OUT = "0.350000"
+DO_FXAA = "1.000000"
+DO_SHIFT_RGB = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_PAL = "1.000000"
+SAT_BLEED_STRENGTH = "0.500000"
+SAT_BLEED_SIZE_LEFT = "3.000000"
+SAT_BLEED_SIZE_RIGHT = "3.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.750000"
+IN_GLOW_WH = "3.500000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+DARKLINES_STRENGTH = "1.000000"
+DO_DARKLINES_VOFFSET = "0.000000"
+DARKLINES_PERIOD = "2.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.350000"
+HALO_W = "3.000000"
+HALO_H = "3.000000"
+SCANLINE_DARK = "0.700000"
+SCANLINE_COMPENSATION = "0.200000"
+SCANLINES_BLEEDING = "1.000000"
+SCANLINE_FLICKERING = "0.000000"
+SCANLINE_FLICKERING_POWER = "0.500000"
+DO_BLOOM = "1.000000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.500000"
+GEOM_WARP_Y = "0.500000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_INNER_ZOOM = "-0.005000"
+BEZEL_FRAME_ZOOM = "0.139000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "5.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/tv-aperturegrille-bloom.slangp b/bezel/koko-aio/tv-aperturegrille-bloom.slangp
new file mode 100644
index 0000000..51beb2a
--- /dev/null
+++ b/bezel/koko-aio/tv-aperturegrille-bloom.slangp
@@ -0,0 +1,246 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+TEMPERATURE = "7000.000000"
+GAMMA_OUT = "0.350000"
+DO_FXAA = "1.000000"
+DO_SHIFT_RGB = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_PAL = "1.000000"
+SAT_BLEED_STRENGTH = "0.500000"
+SAT_BLEED_SIZE_LEFT = "3.000000"
+SAT_BLEED_SIZE_RIGHT = "3.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.750000"
+IN_GLOW_WH = "3.500000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+DARKLINES_STRENGTH = "1.000000"
+DO_DARKLINES_VOFFSET = "0.000000"
+DARKLINES_PERIOD = "2.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.350000"
+HALO_W = "3.000000"
+HALO_H = "3.000000"
+SCANLINE_DARK = "0.700000"
+SCANLINE_COMPENSATION = "0.200000"
+SCANLINES_BLEEDING = "1.000000"
+SCANLINE_FLICKERING = "0.000000"
+SCANLINE_FLICKERING_POWER = "0.500000"
+DO_BLOOM = "1.000000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.000000"
+GEOM_CORNER_SMOOTH = "200.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/tv-aperturegrille.slangp b/bezel/koko-aio/tv-aperturegrille.slangp
new file mode 100644
index 0000000..98c5db5
--- /dev/null
+++ b/bezel/koko-aio/tv-aperturegrille.slangp
@@ -0,0 +1,245 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+TEMPERATURE = "7000.000000"
+GAMMA_OUT = "0.350000"
+DO_FXAA = "1.000000"
+DO_SHIFT_RGB = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_PAL = "1.000000"
+SAT_BLEED_STRENGTH = "0.500000"
+SAT_BLEED_SIZE_LEFT = "3.000000"
+SAT_BLEED_SIZE_RIGHT = "3.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.900000"
+IN_GLOW_WH = "3.500000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+DARKLINES_STRENGTH = "1.000000"
+DO_DARKLINES_VOFFSET = "0.000000"
+DARKLINES_PERIOD = "2.000000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.350000"
+HALO_W = "3.000000"
+HALO_H = "3.000000"
+SCANLINE_DARK = "0.700000"
+SCANLINE_COMPENSATION = "0.200000"
+SCANLINES_BLEEDING = "1.000000"
+SCANLINE_FLICKERING = "0.000000"
+SCANLINE_FLICKERING_POWER = "0.500000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.000000"
+GEOM_CORNER_SMOOTH = "200.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/tv-slotmask-bloom-bezel.slangp b/bezel/koko-aio/tv-slotmask-bloom-bezel.slangp
new file mode 100644
index 0000000..f3d21b4
--- /dev/null
+++ b/bezel/koko-aio/tv-slotmask-bloom-bezel.slangp
@@ -0,0 +1,251 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+TEMPERATURE = "7000.000000"
+GAMMA_OUT = "0.550000"
+DO_FXAA = "1.000000"
+DO_SHIFT_RGB = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_PAL = "1.000000"
+SAT_BLEED_STRENGTH = "0.500000"
+SAT_BLEED_SIZE_LEFT = "3.000000"
+SAT_BLEED_SIZE_RIGHT = "3.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.600000"
+IN_GLOW_WH = "3.500000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+DARKLINES_STRENGTH = "0.900000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.520000"
+HALO_W = "3.000000"
+HALO_H = "3.000000"
+HALO_GAMMA = "1.100000"
+DO_SCANLINES = "1.000000"
+SCANLINE_DARK = "0.700000"
+SCANLINE_COMPENSATION = "0.200000"
+SCANLINES_BLEEDING = "1.000000"
+SCANLINE_FLICKERING = "0.000000"
+SCANLINE_FLICKERING_POWER = "0.500000"
+DO_BLOOM = "1.000000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.800000"
+GEOM_WARP_Y = "0.850000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.600000"
+AMBI_POWER = "2.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/tv-slotmask-bloom-bezelwider.slangp b/bezel/koko-aio/tv-slotmask-bloom-bezelwider.slangp
new file mode 100644
index 0000000..368076f
--- /dev/null
+++ b/bezel/koko-aio/tv-slotmask-bloom-bezelwider.slangp
@@ -0,0 +1,253 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+TEMPERATURE = "7000.000000"
+GAMMA_OUT = "0.550000"
+DO_FXAA = "1.000000"
+DO_SHIFT_RGB = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_PAL = "1.000000"
+SAT_BLEED_STRENGTH = "0.500000"
+SAT_BLEED_SIZE_LEFT = "3.000000"
+SAT_BLEED_SIZE_RIGHT = "3.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.600000"
+IN_GLOW_WH = "3.500000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+DARKLINES_STRENGTH = "0.900000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.520000"
+HALO_W = "3.000000"
+HALO_H = "3.000000"
+HALO_GAMMA = "1.100000"
+DO_SCANLINES = "1.000000"
+SCANLINE_DARK = "0.700000"
+SCANLINE_COMPENSATION = "0.200000"
+SCANLINES_BLEEDING = "1.000000"
+SCANLINE_FLICKERING = "0.000000"
+SCANLINE_FLICKERING_POWER = "0.500000"
+DO_BLOOM = "1.000000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.500000"
+GEOM_WARP_Y = "0.500000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_INNER_ZOOM = "-0.005000"
+BEZEL_FRAME_ZOOM = "0.139000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "5.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/tv-slotmask-bloom.slangp b/bezel/koko-aio/tv-slotmask-bloom.slangp
new file mode 100644
index 0000000..15e3301
--- /dev/null
+++ b/bezel/koko-aio/tv-slotmask-bloom.slangp
@@ -0,0 +1,246 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+TEMPERATURE = "7000.000000"
+GAMMA_OUT = "0.550000"
+DO_FXAA = "1.000000"
+DO_SHIFT_RGB = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_PAL = "1.000000"
+SAT_BLEED_STRENGTH = "0.500000"
+SAT_BLEED_SIZE_LEFT = "3.000000"
+SAT_BLEED_SIZE_RIGHT = "3.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.600000"
+IN_GLOW_WH = "3.500000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+DARKLINES_STRENGTH = "0.900000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.520000"
+HALO_W = "3.000000"
+HALO_H = "3.000000"
+HALO_GAMMA = "1.100000"
+DO_SCANLINES = "1.000000"
+SCANLINE_DARK = "0.700000"
+SCANLINE_COMPENSATION = "0.200000"
+SCANLINES_BLEEDING = "1.000000"
+SCANLINE_FLICKERING = "0.000000"
+SCANLINE_FLICKERING_POWER = "0.500000"
+DO_BLOOM = "1.000000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.000000"
+GEOM_CORNER_SMOOTH = "200.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/tv-slotmask.slangp b/bezel/koko-aio/tv-slotmask.slangp
new file mode 100644
index 0000000..b44d5d7
--- /dev/null
+++ b/bezel/koko-aio/tv-slotmask.slangp
@@ -0,0 +1,245 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+TEMPERATURE = "7000.000000"
+GAMMA_OUT = "0.550000"
+DO_FXAA = "1.000000"
+DO_SHIFT_RGB = "1.000000"
+OFFSET_STRENGTH = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_PAL = "1.000000"
+SAT_BLEED_STRENGTH = "0.500000"
+SAT_BLEED_SIZE_LEFT = "3.000000"
+SAT_BLEED_SIZE_RIGHT = "3.000000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.600000"
+IN_GLOW_WH = "3.500000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+DARKLINES_STRENGTH = "0.900000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.520000"
+HALO_W = "3.000000"
+HALO_H = "3.000000"
+HALO_GAMMA = "1.100000"
+DO_SCANLINES = "1.000000"
+SCANLINE_DARK = "0.700000"
+SCANLINE_COMPENSATION = "0.200000"
+SCANLINES_BLEEDING = "1.000000"
+SCANLINE_FLICKERING = "0.000000"
+SCANLINE_FLICKERING_POWER = "0.500000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.000000"
+GEOM_CORNER_SMOOTH = "200.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.400000"
+AMBI_POWER = "1.000000"
+V_SIZE = "2.700000"
+V_POWER = "1.050000"
+S_POSITION = "194.000000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"
diff --git a/bezel/koko-aio/tv-vibrant.slangp b/bezel/koko-aio/tv-vibrant.slangp
new file mode 100644
index 0000000..dff1b3b
--- /dev/null
+++ b/bezel/koko-aio/tv-vibrant.slangp
@@ -0,0 +1,253 @@
+shaders = "17"
+shader0 = "shaders/first_pass.slang"
+filter_linear0 = "false"
+wrap_mode0 = "mirrored_repeat"
+mipmap_input0 = "false"
+alias0 = "first_pass"
+float_framebuffer0 = "false"
+srgb_framebuffer0 = "false"
+scale_type_x0 = "source"
+scale_x0 = "2.000000"
+scale_type_y0 = "source"
+scale_y0 = "2.000000"
+shader1 = "shaders/fxaa.slang"
+filter_linear1 = "true"
+wrap_mode1 = "mirrored_repeat"
+mipmap_input1 = "true"
+alias1 = "FXAA_pass"
+float_framebuffer1 = "false"
+srgb_framebuffer1 = "false"
+scale_type_x1 = "source"
+scale_x1 = "1.000000"
+scale_type_y1 = "source"
+scale_y1 = "1.000000"
+shader2 = "shaders/shift_and_bleed.slang"
+filter_linear2 = "true"
+wrap_mode2 = "mirrored_repeat"
+mipmap_input2 = "false"
+alias2 = "shift_and_bleed_pass"
+float_framebuffer2 = "false"
+srgb_framebuffer2 = "false"
+scale_type_x2 = "source"
+scale_x2 = "1.000000"
+scale_type_y2 = "source"
+scale_y2 = "1.000000"
+shader3 = "shaders/in_glow.slang"
+filter_linear3 = "true"
+wrap_mode3 = "mirrored_repeat"
+mipmap_input3 = "false"
+alias3 = "in_glow_pass"
+float_framebuffer3 = "true"
+srgb_framebuffer3 = "false"
+scale_type_x3 = "source"
+scale_x3 = "1.000000"
+scale_type_y3 = "source"
+scale_y3 = "1.000000"
+shader4 = "shaders/halo.slang"
+filter_linear4 = "true"
+wrap_mode4 = "mirrored_repeat"
+mipmap_input4 = "false"
+alias4 = "halo_pass"
+float_framebuffer4 = "true"
+srgb_framebuffer4 = "false"
+scale_type_x4 = "source"
+scale_x4 = "1.000000"
+scale_type_y4 = "source"
+scale_y4 = "1.000000"
+shader5 = "shaders/avglum_pass.slang"
+filter_linear5 = "true"
+wrap_mode5 = "mirrored_repeat"
+mipmap_input5 = "false"
+alias5 = "avglum_pass"
+float_framebuffer5 = "false"
+srgb_framebuffer5 = "false"
+scale_type_x5 = "source"
+scale_x5 = "0.500000"
+scale_type_y5 = "source"
+scale_y5 = "0.500000"
+shader6 = "shaders/reflection_blur_h.slang"
+filter_linear6 = "true"
+wrap_mode6 = "mirrored_repeat"
+mipmap_input6 = "false"
+alias6 = "reflected_blurred_pass1"
+float_framebuffer6 = "false"
+srgb_framebuffer6 = "false"
+scale_type_x6 = "source"
+scale_x6 = "1.000000"
+scale_type_y6 = "source"
+scale_y6 = "1.000000"
+shader7 = "shaders/reflection_blur_v.slang"
+filter_linear7 = "true"
+wrap_mode7 = "mirrored_repeat"
+mipmap_input7 = "false"
+alias7 = "reflected_blurred_pass2"
+float_framebuffer7 = "false"
+srgb_framebuffer7 = "false"
+scale_type_x7 = "source"
+scale_x7 = "1.000000"
+scale_type_y7 = "source"
+scale_y7 = "1.000000"
+shader8 = "shaders/bloom_pass_1.slang"
+filter_linear8 = "true"
+wrap_mode8 = "mirrored_repeat"
+mipmap_input8 = "false"
+alias8 = "bloom_pass_1"
+float_framebuffer8 = "true"
+srgb_framebuffer8 = "false"
+scale_type_x8 = "source"
+scale_x8 = "1.000000"
+scale_type_y8 = "source"
+scale_y8 = "1.000000"
+shader9 = "shaders/bloom_pass_2.slang"
+filter_linear9 = "true"
+wrap_mode9 = "clamp_to_edge"
+mipmap_input9 = "false"
+alias9 = "bloom_pass_2"
+float_framebuffer9 = "false"
+srgb_framebuffer9 = "false"
+scale_type_x9 = "source"
+scale_x9 = "0.500000"
+scale_type_y9 = "source"
+scale_y9 = "0.500000"
+shader10 = "shaders/bloom_pass_3.slang"
+filter_linear10 = "true"
+wrap_mode10 = "clamp_to_edge"
+mipmap_input10 = "false"
+alias10 = "bloom_pass_3"
+float_framebuffer10 = "false"
+srgb_framebuffer10 = "false"
+scale_type_x10 = "source"
+scale_x10 = "1.000000"
+scale_type_y10 = "source"
+scale_y10 = "1.000000"
+shader11 = "shaders/bloom_pass_4.slang"
+filter_linear11 = "true"
+wrap_mode11 = "mirrored_repeat"
+mipmap_input11 = "false"
+alias11 = "bloom_pass_final"
+float_framebuffer11 = "false"
+srgb_framebuffer11 = "false"
+scale_type_x11 = "source"
+scale_x11 = "1.000000"
+scale_type_y11 = "source"
+scale_y11 = "1.000000"
+shader12 = "shaders/ambi_push_pass.slang"
+filter_linear12 = "true"
+wrap_mode12 = "mirrored_repeat"
+mipmap_input12 = "false"
+alias12 = "ambi_push_pass"
+float_framebuffer12 = "true"
+srgb_framebuffer12 = "false"
+scale_type_x12 = "source"
+scale_x12 = "1.000000"
+scale_type_y12 = "source"
+scale_y12 = "1.000000"
+shader13 = "shaders/ambi_pre_pass.slang"
+filter_linear13 = "true"
+wrap_mode13 = "clamp_to_border"
+mipmap_input13 = "true"
+alias13 = "ambi_pre_pass1"
+float_framebuffer13 = "false"
+srgb_framebuffer13 = "false"
+scale_type_x13 = "source"
+scale_x13 = "1.000000"
+scale_type_y13 = "source"
+scale_y13 = "1.000000"
+shader14 = "shaders/ambi_temporal_pass.slang"
+filter_linear14 = "true"
+wrap_mode14 = "clamp_to_border"
+mipmap_input14 = "false"
+alias14 = "ambi_temporal_pass"
+float_framebuffer14 = "true"
+srgb_framebuffer14 = "false"
+scale_type_x14 = "source"
+scale_x14 = "1.000000"
+scale_type_y14 = "source"
+scale_y14 = "1.000000"
+shader15 = "shaders/isrotated.slang"
+filter_linear15 = "true"
+wrap_mode15 = "mirrored_repeat"
+mipmap_input15 = "false"
+alias15 = "isrotated_pass"
+float_framebuffer15 = "false"
+srgb_framebuffer15 = "false"
+scale_type_x15 = "viewport"
+scale_x15 = "0.100000"
+scale_type_y15 = "viewport"
+scale_y15 = "0.100000"
+shader16 = "shaders/final_pass.slang"
+filter_linear16 = "true"
+wrap_mode16 = "mirrored_repeat"
+mipmap_input16 = "false"
+alias16 = "final_pass"
+float_framebuffer16 = "false"
+srgb_framebuffer16 = "false"
+scale_type_x16 = "viewport"
+scale_x16 = "1.000000"
+scale_type_y16 = "viewport"
+scale_y16 = "1.000000"
+DO_CCORRECTION = "1.000000"
+LUMINANCE = "0.300000"
+TEMPERATURE = "7200.000000"
+GAMMA_OUT = "0.450000"
+DO_FXAA = "1.000000"
+SHIFT_R = "-20.000000"
+SHIFT_G = "1.000000"
+SHIFT_B = "20.000000"
+DO_SAT_BLEED = "1.000000"
+SAT_BLEED_FALLOFF = "1.800000"
+DO_IN_GLOW = "1.000000"
+IN_GLOW_POWER = "1.700000"
+IN_GLOW_WH = "2.000000"
+IN_GLOW_GAMMA = "2.000000"
+DO_VMASK_AND_DARKLINES = "1.000000"
+RGB_MASK_STRENGTH = "1.000000"
+VMASK_USE_GM = "1.000000"
+VMASK_GAP = "1.000000"
+VMASK_OVERWHITE = "0.750000"
+DARKLINES_STRENGTH = "0.400000"
+DARKLINES_PERIOD = "6.000000"
+DRKLN_OVERWHITE = "0.750000"
+DO_HALO = "1.000000"
+HALO_POWER = "0.450000"
+HALO_W = "3.500000"
+HALO_H = "3.500000"
+HALO_GAMMA = "1.200000"
+DO_SCANLINES = "1.000000"
+SCANLINE_DARK = "0.100000"
+SCANLINES_BLEEDING = "0.825000"
+SCANLINE_FLICKERING = "1.000000"
+SCANLINE_FLICKERING_POWER = "0.850000"
+DO_BLOOM = "1.000000"
+BLOOM_MIX = "0.150000"
+BLOOM_SIZE = "1.500000"
+BLOOM_POWER = "8.000000"
+BLOOM_GAMMA_OUT = "1.200000"
+DO_CURVATURE = "1.000000"
+GEOM_WARP_X = "0.800000"
+GEOM_WARP_Y = "0.850000"
+GEOM_CORNER_SIZE = "0.005000"
+GEOM_CORNER_SMOOTH = "700.000000"
+DO_BEZEL = "1.000000"
+BEZEL_IMAGE_BORDER = "1.020000"
+AMBI_FALLOFF = "0.600000"
+AMBI_POWER = "2.000000"
+DO_VIGNETTE = "1.000000"
+V_SIZE = "1.900000"
+V_POWER = "1.050000"
+DO_SPOT = "1.000000"
+S_POSITION = "194.000000"
+S_POWER = "0.200000"
+textures = "monitor_body;bg_under;bg_over"
+monitor_body = "textures/monitor_body.png"
+monitor_body_linear = "true"
+monitor_body_wrap_mode = "clamp_to_edge"
+monitor_body_mipmap = "true"
+bg_under = "textures/background_under.png"
+bg_under_linear = "true"
+bg_under_wrap_mode = "mirrored_repeat"
+bg_under_mipmap = "true"
+bg_over = "textures/background_over.png"
+bg_over_linear = "true"
+bg_over_wrap_mode = "mirrored_repeat"
+bg_over_mipmap = "true"