/* * Nuklear - 1.32.0 - public domain * no warrenty implied; use at your own risk. * authored from 2015-2016 by Micha Mettke */ /* * ============================================================== * * API * * =============================================================== */ #ifndef NK_GLFW_VULKAN_H_ #define NK_GLFW_VULKAN_H_ unsigned char nuklearshaders_nuklear_vert_spv[] = { 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x00, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x63, 0x70, 0x70, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x65, 0x72, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x05, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x55, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x75, 0x62, 0x6f, 0x00, 0x05, 0x00, 0x05, 0x00, 0x16, 0x00, 0x00, 0x00, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x27, 0x00, 0x00, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x42, 0x00, 0x00, 0x00, 0x66, 0x72, 0x61, 0x67, 0x55, 0x76, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x43, 0x00, 0x00, 0x00, 0x75, 0x76, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x27, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x42, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x43, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x20, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x22, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x29, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x29, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x43, 0x2b, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x41, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x41, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x91, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x41, 0x00, 0x06, 0x00, 0x22, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x41, 0x00, 0x06, 0x00, 0x22, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x26, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x70, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x70, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x70, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x70, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x88, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x27, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x42, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00 }; unsigned int nuklearshaders_nuklear_vert_spv_len = 1856; unsigned char nuklearshaders_nuklear_frag_spv[] = { 0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x04, 0x00, 0x09, 0x00, 0x47, 0x4c, 0x5f, 0x41, 0x52, 0x42, 0x5f, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x00, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x63, 0x70, 0x70, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x00, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x66, 0x72, 0x61, 0x67, 0x55, 0x76, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x17, 0x00, 0x00, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x19, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x57, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x85, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00 }; unsigned int nuklearshaders_nuklear_frag_spv_len = 860; #include #include #include #define GLFW_INCLUDE_VULKAN #include enum nk_glfw_init_state { NK_GLFW3_DEFAULT = 0, NK_GLFW3_INSTALL_CALLBACKS }; NK_API struct nk_context * nk_glfw3_init(GLFWwindow *win, VkDevice logical_device, VkPhysicalDevice physical_device, uint32_t graphics_queue_family_index, VkImageView *image_views, uint32_t image_views_len, VkFormat color_format, enum nk_glfw_init_state init_state, VkDeviceSize max_vertex_buffer, VkDeviceSize max_element_buffer); NK_API void nk_glfw3_shutdown(void); NK_API void nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas); NK_API void nk_glfw3_font_stash_end(VkQueue graphics_queue); NK_API void nk_glfw3_new_frame(); NK_API VkSemaphore nk_glfw3_render(VkQueue graphics_queue, uint32_t buffer_index, VkSemaphore wait_semaphore, enum nk_anti_aliasing AA); NK_API void nk_glfw3_resize(uint32_t framebuffer_width, uint32_t framebuffer_height); NK_API void nk_glfw3_device_destroy(void); NK_API void nk_glfw3_device_create( VkDevice logical_device, VkPhysicalDevice physical_device, uint32_t graphics_queue_family_index, VkImageView *image_views, uint32_t image_views_len, VkFormat color_format, VkDeviceSize max_vertex_buffer, VkDeviceSize max_element_buffer, uint32_t framebuffer_width, uint32_t framebuffer_height); NK_API void nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint); NK_API void nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff); NK_API void nk_glfw3_mouse_button_callback(GLFWwindow *win, int button, int action, int mods); #endif /* * ============================================================== * * IMPLEMENTATION * * =============================================================== */ #ifdef NK_GLFW_VULKAN_IMPLEMENTATION #undef NK_GLFW_VULKAN_IMPLEMENTATION #include #ifndef NK_GLFW_TEXT_MAX #define NK_GLFW_TEXT_MAX 256 #endif #ifndef NK_GLFW_DOUBLE_CLICK_LO #define NK_GLFW_DOUBLE_CLICK_LO 0.02 #endif #ifndef NK_GLFW_DOUBLE_CLICK_HI #define NK_GLFW_DOUBLE_CLICK_HI 0.2 #endif #ifndef NK_GLFW_MAX_TEXTURES #define NK_GLFW_MAX_TEXTURES 256 #endif #define VK_COLOR_COMPONENT_MASK_RGBA \ VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | \ VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT struct nk_glfw_vertex { float position[2]; float uv[2]; nk_byte col[4]; }; struct nk_vulkan_texture_descriptor_set { VkImageView image_view; VkDescriptorSet descriptor_set; }; struct nk_glfw_device { struct nk_buffer cmds; struct nk_draw_null_texture tex_null; int max_vertex_buffer; int max_element_buffer; VkDevice logical_device; VkPhysicalDevice physical_device; VkImageView *image_views; uint32_t image_views_len; VkFormat color_format; VkFramebuffer *framebuffers; uint32_t framebuffers_len; VkCommandBuffer *command_buffers; uint32_t command_buffers_len; VkSampler sampler; VkCommandPool command_pool; VkSemaphore render_completed; VkBuffer vertex_buffer; VkDeviceMemory vertex_memory; void *mapped_vertex; VkBuffer index_buffer; VkDeviceMemory index_memory; void *mapped_index; VkBuffer uniform_buffer; VkDeviceMemory uniform_memory; void *mapped_uniform; VkRenderPass render_pass; VkDescriptorPool descriptor_pool; VkDescriptorSetLayout uniform_descriptor_set_layout; VkDescriptorSet uniform_descriptor_set; VkDescriptorSetLayout texture_descriptor_set_layout; struct nk_vulkan_texture_descriptor_set *texture_descriptor_sets; uint32_t texture_descriptor_sets_len; VkPipelineLayout pipeline_layout; VkPipeline pipeline; VkImage font_image; VkImageView font_image_view; VkDeviceMemory font_memory; }; static struct nk_glfw { GLFWwindow *win; int width, height; int display_width, display_height; struct nk_glfw_device vulkan; struct nk_context ctx; struct nk_font_atlas atlas; struct nk_vec2 fb_scale; unsigned int text[NK_GLFW_TEXT_MAX]; int text_len; struct nk_vec2 scroll; double last_button_click; int is_double_click_down; struct nk_vec2 double_click_pos; } glfw; struct Mat4f { float m[16]; }; NK_INTERN uint32_t nk_glfw3_find_memory_index( VkPhysicalDevice physical_device, uint32_t type_filter, VkMemoryPropertyFlags properties) { VkPhysicalDeviceMemoryProperties mem_properties; uint32_t i; vkGetPhysicalDeviceMemoryProperties(physical_device, &mem_properties); for (i = 0; i < mem_properties.memoryTypeCount; i++) { if ((type_filter & (1 << i)) && (mem_properties.memoryTypes[i].propertyFlags & properties) == properties) { return i; } } assert(0); return 0; } NK_INTERN void nk_glfw3_create_sampler(struct nk_glfw_device *dev) { VkResult result; VkSamplerCreateInfo sampler_info; memset(&sampler_info, 0, sizeof(VkSamplerCreateInfo)); sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; sampler_info.pNext = NULL; sampler_info.maxAnisotropy = 1.0; sampler_info.magFilter = VK_FILTER_LINEAR; sampler_info.minFilter = VK_FILTER_LINEAR; sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; sampler_info.mipLodBias = 0.0f; sampler_info.compareEnable = VK_FALSE; sampler_info.compareOp = VK_COMPARE_OP_ALWAYS; sampler_info.minLod = 0.0f; sampler_info.maxLod = 0.0f; sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK; result = vkCreateSampler(dev->logical_device, &sampler_info, NULL, &dev->sampler); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN void nk_glfw3_create_command_pool(struct nk_glfw_device *dev, uint32_t graphics_queue_family_index) { VkResult result; VkCommandPoolCreateInfo pool_info; memset(&pool_info, 0, sizeof(VkCommandPoolCreateInfo)); pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; pool_info.queueFamilyIndex = graphics_queue_family_index; pool_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; result = vkCreateCommandPool(dev->logical_device, &pool_info, NULL, &dev->command_pool); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN void nk_glfw3_create_command_buffers(struct nk_glfw_device *dev) { VkResult result; VkCommandBufferAllocateInfo allocate_info; memset(&allocate_info, 0, sizeof(VkCommandBufferAllocateInfo)); dev->command_buffers = (VkCommandBuffer *)malloc(dev->image_views_len * sizeof(VkCommandBuffer)); dev->command_buffers_len = dev->image_views_len; allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; allocate_info.commandPool = dev->command_pool; allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; allocate_info.commandBufferCount = dev->command_buffers_len; result = vkAllocateCommandBuffers(dev->logical_device, &allocate_info, dev->command_buffers); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN void nk_glfw3_create_semaphore(struct nk_glfw_device *dev) { VkResult result; VkSemaphoreCreateInfo semaphore_info; memset(&semaphore_info, 0, sizeof(VkSemaphoreCreateInfo)); semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; result = (vkCreateSemaphore(dev->logical_device, &semaphore_info, NULL, &dev->render_completed)); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN void nk_glfw3_create_buffer_and_memory(struct nk_glfw_device *dev, VkBuffer *buffer, VkBufferUsageFlags usage, VkDeviceMemory *memory, VkDeviceSize size) { VkMemoryRequirements mem_reqs; VkResult result; VkBufferCreateInfo buffer_info; VkMemoryAllocateInfo alloc_info; memset(&buffer_info, 0, sizeof(VkBufferCreateInfo)); buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; buffer_info.size = size; buffer_info.usage = usage; buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; result = vkCreateBuffer(dev->logical_device, &buffer_info, NULL, buffer); NK_ASSERT(result == VK_SUCCESS); vkGetBufferMemoryRequirements(dev->logical_device, *buffer, &mem_reqs); memset(&alloc_info, 0, sizeof(VkMemoryAllocateInfo)); alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; alloc_info.allocationSize = mem_reqs.size; alloc_info.memoryTypeIndex = nk_glfw3_find_memory_index( dev->physical_device, mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); result = vkAllocateMemory(dev->logical_device, &alloc_info, NULL, memory); NK_ASSERT(result == VK_SUCCESS); result = vkBindBufferMemory(dev->logical_device, *buffer, *memory, 0); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN void nk_glfw3_create_render_pass(struct nk_glfw_device *dev) { VkAttachmentDescription attachment; VkAttachmentReference color_reference; VkSubpassDependency subpass_dependency; VkSubpassDescription subpass_description; VkRenderPassCreateInfo render_pass_info; VkResult result; memset(&attachment, 0, sizeof(VkAttachmentDescription)); attachment.format = dev->color_format; attachment.samples = VK_SAMPLE_COUNT_1_BIT; attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; attachment.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; memset(&color_reference, 0, sizeof(VkAttachmentReference)); color_reference.attachment = 0; color_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; memset(&subpass_dependency, 0, sizeof(VkSubpassDependency)); subpass_dependency.srcSubpass = VK_SUBPASS_EXTERNAL; subpass_dependency.srcAccessMask = 0; subpass_dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; subpass_dependency.dstSubpass = 0; subpass_dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; subpass_dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; memset(&subpass_description, 0, sizeof(VkSubpassDescription)); subpass_description.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; subpass_description.colorAttachmentCount = 1; subpass_description.pColorAttachments = &color_reference; memset(&render_pass_info, 0, sizeof(VkRenderPassCreateInfo)); render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; render_pass_info.attachmentCount = 1; render_pass_info.pAttachments = &attachment; render_pass_info.subpassCount = 1; render_pass_info.pSubpasses = &subpass_description; render_pass_info.dependencyCount = 1; render_pass_info.pDependencies = &subpass_dependency; result = vkCreateRenderPass(dev->logical_device, &render_pass_info, NULL, &dev->render_pass); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN void nk_glfw3_create_framebuffers(struct nk_glfw_device *dev, uint32_t framebuffer_width, uint32_t framebuffer_height) { VkFramebufferCreateInfo framebuffer_create_info; uint32_t i; VkResult result; dev->framebuffers = (VkFramebuffer *)malloc(dev->image_views_len * sizeof(VkFramebuffer)); memset(&framebuffer_create_info, 0, sizeof(VkFramebufferCreateInfo)); framebuffer_create_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebuffer_create_info.renderPass = dev->render_pass; framebuffer_create_info.attachmentCount = 1; framebuffer_create_info.width = framebuffer_width; framebuffer_create_info.height = framebuffer_height; framebuffer_create_info.layers = 1; for (i = 0; i < dev->image_views_len; i++) { framebuffer_create_info.pAttachments = &dev->image_views[i]; result = vkCreateFramebuffer(dev->logical_device, &framebuffer_create_info, NULL, &dev->framebuffers[i]); NK_ASSERT(result == VK_SUCCESS); } dev->framebuffers_len = dev->image_views_len; } NK_INTERN void nk_glfw3_create_descriptor_pool(struct nk_glfw_device *dev) { VkDescriptorPoolSize pool_sizes[2]; VkDescriptorPoolCreateInfo pool_info; VkResult result; memset(&pool_sizes, 0, sizeof(VkDescriptorPoolSize) * 2); pool_sizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; pool_sizes[0].descriptorCount = 1; pool_sizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; pool_sizes[1].descriptorCount = NK_GLFW_MAX_TEXTURES; memset(&pool_info, 0, sizeof(VkDescriptorPoolCreateInfo)); pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; pool_info.poolSizeCount = 2; pool_info.pPoolSizes = pool_sizes; pool_info.maxSets = 1 + NK_GLFW_MAX_TEXTURES; result = vkCreateDescriptorPool(dev->logical_device, &pool_info, NULL, &dev->descriptor_pool); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN void nk_glfw3_create_uniform_descriptor_set_layout(struct nk_glfw_device *dev) { VkDescriptorSetLayoutBinding binding; VkDescriptorSetLayoutCreateInfo descriptor_set_info; VkResult result; memset(&binding, 0, sizeof(VkDescriptorSetLayoutBinding)); binding.binding = 0; binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; binding.descriptorCount = 1; binding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; memset(&descriptor_set_info, 0, sizeof(VkDescriptorSetLayoutCreateInfo)); descriptor_set_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; descriptor_set_info.bindingCount = 1; descriptor_set_info.pBindings = &binding; result = vkCreateDescriptorSetLayout(dev->logical_device, &descriptor_set_info, NULL, &dev->uniform_descriptor_set_layout); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN void nk_glfw3_create_and_update_uniform_descriptor_set(struct nk_glfw_device *dev) { VkDescriptorSetAllocateInfo allocate_info; VkDescriptorBufferInfo buffer_info; VkWriteDescriptorSet descriptor_write; VkResult result; memset(&allocate_info, 0, sizeof(VkDescriptorSetAllocateInfo)); allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; allocate_info.descriptorPool = dev->descriptor_pool; allocate_info.descriptorSetCount = 1; allocate_info.pSetLayouts = &dev->uniform_descriptor_set_layout; result = vkAllocateDescriptorSets(dev->logical_device, &allocate_info, &dev->uniform_descriptor_set); NK_ASSERT(result == VK_SUCCESS); memset(&buffer_info, 0, sizeof(VkDescriptorBufferInfo)); buffer_info.buffer = dev->uniform_buffer; buffer_info.offset = 0; buffer_info.range = sizeof(struct Mat4f); memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet)); descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; descriptor_write.dstSet = dev->uniform_descriptor_set; descriptor_write.dstBinding = 0; descriptor_write.dstArrayElement = 0; descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; descriptor_write.descriptorCount = 1; descriptor_write.pBufferInfo = &buffer_info; vkUpdateDescriptorSets(dev->logical_device, 1, &descriptor_write, 0, NULL); } NK_INTERN void nk_glfw3_create_texture_descriptor_set_layout(struct nk_glfw_device *dev) { VkDescriptorSetLayoutBinding binding; VkDescriptorSetLayoutCreateInfo descriptor_set_info; VkResult result; memset(&binding, 0, sizeof(VkDescriptorSetLayoutBinding)); binding.binding = 0; binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; binding.descriptorCount = 1; binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; memset(&descriptor_set_info, 0, sizeof(VkDescriptorSetLayoutCreateInfo)); descriptor_set_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; descriptor_set_info.bindingCount = 1; descriptor_set_info.pBindings = &binding; result = vkCreateDescriptorSetLayout(dev->logical_device, &descriptor_set_info, NULL, &dev->texture_descriptor_set_layout); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN void nk_glfw3_create_texture_descriptor_sets(struct nk_glfw_device *dev) { VkDescriptorSetLayout *descriptor_set_layouts; VkDescriptorSet *descriptor_sets; VkDescriptorSetAllocateInfo allocate_info; VkResult result; int i; descriptor_set_layouts = (VkDescriptorSetLayout *)malloc( NK_GLFW_MAX_TEXTURES * sizeof(VkDescriptorSetLayout)); descriptor_sets = (VkDescriptorSet *)malloc(NK_GLFW_MAX_TEXTURES * sizeof(VkDescriptorSet)); dev->texture_descriptor_sets = (struct nk_vulkan_texture_descriptor_set *)malloc( NK_GLFW_MAX_TEXTURES * sizeof(struct nk_vulkan_texture_descriptor_set)); dev->texture_descriptor_sets_len = 0; for (i = 0; i < NK_GLFW_MAX_TEXTURES; i++) { descriptor_set_layouts[i] = dev->texture_descriptor_set_layout; descriptor_sets[i] = dev->texture_descriptor_sets[i].descriptor_set; } memset(&allocate_info, 0, sizeof(VkDescriptorSetAllocateInfo)); allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; allocate_info.descriptorPool = dev->descriptor_pool; allocate_info.descriptorSetCount = NK_GLFW_MAX_TEXTURES; allocate_info.pSetLayouts = descriptor_set_layouts; result = vkAllocateDescriptorSets(dev->logical_device, &allocate_info, descriptor_sets); NK_ASSERT(result == VK_SUCCESS); for (i = 0; i < NK_GLFW_MAX_TEXTURES; i++) { dev->texture_descriptor_sets[i].descriptor_set = descriptor_sets[i]; } free(descriptor_set_layouts); free(descriptor_sets); } NK_INTERN void nk_glfw3_create_pipeline_layout(struct nk_glfw_device *dev) { VkPipelineLayoutCreateInfo pipeline_layout_info; VkDescriptorSetLayout descriptor_set_layouts[2]; VkResult result; descriptor_set_layouts[0] = dev->uniform_descriptor_set_layout; descriptor_set_layouts[1] = dev->texture_descriptor_set_layout; memset(&pipeline_layout_info, 0, sizeof(VkPipelineLayoutCreateInfo)); pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; pipeline_layout_info.setLayoutCount = 2; pipeline_layout_info.pSetLayouts = descriptor_set_layouts; result = (vkCreatePipelineLayout(dev->logical_device, &pipeline_layout_info, NULL, &dev->pipeline_layout)); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN VkPipelineShaderStageCreateInfo nk_glfw3_create_shader(struct nk_glfw_device *dev, unsigned char *spv_shader, uint32_t size, VkShaderStageFlagBits stage_bit) { VkShaderModuleCreateInfo create_info; VkPipelineShaderStageCreateInfo shader_info; VkShaderModule module = NULL; VkResult result; memset(&create_info, 0, sizeof(VkShaderModuleCreateInfo)); create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; create_info.codeSize = size; create_info.pCode = (const uint32_t *)spv_shader; result = vkCreateShaderModule(dev->logical_device, &create_info, NULL, &module); NK_ASSERT(result == VK_SUCCESS); memset(&shader_info, 0, sizeof(VkPipelineShaderStageCreateInfo)); shader_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; shader_info.stage = stage_bit; shader_info.module = module; shader_info.pName = "main"; return shader_info; } NK_INTERN void nk_glfw3_create_pipeline(struct nk_glfw_device *dev) { VkPipelineInputAssemblyStateCreateInfo input_assembly_state; VkPipelineRasterizationStateCreateInfo rasterization_state; VkPipelineColorBlendAttachmentState attachment_state = { VK_TRUE, VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_OP_ADD, VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE, VK_BLEND_OP_ADD, VK_COLOR_COMPONENT_MASK_RGBA, }; VkPipelineColorBlendStateCreateInfo color_blend_state; VkPipelineViewportStateCreateInfo viewport_state; VkPipelineMultisampleStateCreateInfo multisample_state; VkDynamicState dynamic_states[2] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR}; VkPipelineDynamicStateCreateInfo dynamic_state; VkPipelineShaderStageCreateInfo shader_stages[2]; VkVertexInputBindingDescription vertex_input_info; VkVertexInputAttributeDescription vertex_attribute_description[3]; VkPipelineVertexInputStateCreateInfo vertex_input; VkGraphicsPipelineCreateInfo pipeline_info; VkResult result; memset(&input_assembly_state, 0, sizeof(VkPipelineInputAssemblyStateCreateInfo)); input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; input_assembly_state.primitiveRestartEnable = VK_FALSE; memset(&rasterization_state, 0, sizeof(VkPipelineRasterizationStateCreateInfo)); rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; rasterization_state.polygonMode = VK_POLYGON_MODE_FILL; rasterization_state.cullMode = VK_CULL_MODE_NONE; rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; rasterization_state.lineWidth = 1.0f; memset(&color_blend_state, 0, sizeof(VkPipelineColorBlendStateCreateInfo)); color_blend_state.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; color_blend_state.attachmentCount = 1; color_blend_state.pAttachments = &attachment_state; memset(&viewport_state, 0, sizeof(VkPipelineViewportStateCreateInfo)); viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; viewport_state.viewportCount = 1; viewport_state.scissorCount = 1; memset(&multisample_state, 0, sizeof(VkPipelineMultisampleStateCreateInfo)); multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; memset(&dynamic_state, 0, sizeof(VkPipelineDynamicStateCreateInfo)); dynamic_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; dynamic_state.pDynamicStates = dynamic_states; dynamic_state.dynamicStateCount = 2; shader_stages[0] = nk_glfw3_create_shader( dev, nuklearshaders_nuklear_vert_spv, nuklearshaders_nuklear_vert_spv_len, VK_SHADER_STAGE_VERTEX_BIT); shader_stages[1] = nk_glfw3_create_shader( dev, nuklearshaders_nuklear_frag_spv, nuklearshaders_nuklear_frag_spv_len, VK_SHADER_STAGE_FRAGMENT_BIT); memset(&vertex_input_info, 0, sizeof(VkVertexInputBindingDescription)); vertex_input_info.binding = 0; vertex_input_info.stride = sizeof(struct nk_glfw_vertex); vertex_input_info.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; memset(&vertex_attribute_description, 0, sizeof(VkVertexInputAttributeDescription) * 3); vertex_attribute_description[0].location = 0; vertex_attribute_description[0].format = VK_FORMAT_R32G32_SFLOAT; vertex_attribute_description[0].offset = NK_OFFSETOF(struct nk_glfw_vertex, position); vertex_attribute_description[1].location = 1; vertex_attribute_description[1].format = VK_FORMAT_R32G32_SFLOAT; vertex_attribute_description[1].offset = NK_OFFSETOF(struct nk_glfw_vertex, uv); vertex_attribute_description[2].location = 2; vertex_attribute_description[2].format = VK_FORMAT_R8G8B8A8_UINT; vertex_attribute_description[2].offset = NK_OFFSETOF(struct nk_glfw_vertex, col); memset(&vertex_input, 0, sizeof(VkPipelineVertexInputStateCreateInfo)); vertex_input.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; vertex_input.vertexBindingDescriptionCount = 1; vertex_input.pVertexBindingDescriptions = &vertex_input_info; vertex_input.vertexAttributeDescriptionCount = 3; vertex_input.pVertexAttributeDescriptions = vertex_attribute_description; memset(&pipeline_info, 0, sizeof(VkGraphicsPipelineCreateInfo)); pipeline_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; pipeline_info.flags = 0; pipeline_info.stageCount = 2; pipeline_info.pStages = shader_stages; pipeline_info.pVertexInputState = &vertex_input; pipeline_info.pInputAssemblyState = &input_assembly_state; pipeline_info.pViewportState = &viewport_state; pipeline_info.pRasterizationState = &rasterization_state; pipeline_info.pMultisampleState = &multisample_state; pipeline_info.pColorBlendState = &color_blend_state; pipeline_info.pDynamicState = &dynamic_state; pipeline_info.layout = dev->pipeline_layout; pipeline_info.renderPass = dev->render_pass; pipeline_info.basePipelineIndex = -1; pipeline_info.basePipelineHandle = NULL; result = vkCreateGraphicsPipelines(dev->logical_device, NULL, 1, &pipeline_info, NULL, &dev->pipeline); NK_ASSERT(result == VK_SUCCESS); vkDestroyShaderModule(dev->logical_device, shader_stages[0].module, NULL); vkDestroyShaderModule(dev->logical_device, shader_stages[1].module, NULL); } NK_INTERN void nk_glfw3_create_render_resources(struct nk_glfw_device *dev, uint32_t framebuffer_width, uint32_t framebuffer_height) { nk_glfw3_create_render_pass(dev); nk_glfw3_create_framebuffers(dev, framebuffer_width, framebuffer_height); nk_glfw3_create_descriptor_pool(dev); nk_glfw3_create_uniform_descriptor_set_layout(dev); nk_glfw3_create_and_update_uniform_descriptor_set(dev); nk_glfw3_create_texture_descriptor_set_layout(dev); nk_glfw3_create_texture_descriptor_sets(dev); nk_glfw3_create_pipeline_layout(dev); nk_glfw3_create_pipeline(dev); } NK_API void nk_glfw3_device_create( VkDevice logical_device, VkPhysicalDevice physical_device, uint32_t graphics_queue_family_index, VkImageView *image_views, uint32_t image_views_len, VkFormat color_format, VkDeviceSize max_vertex_buffer, VkDeviceSize max_element_buffer, uint32_t framebuffer_width, uint32_t framebuffer_height) { struct nk_glfw_device *dev = &glfw.vulkan; dev->max_vertex_buffer = max_vertex_buffer; dev->max_element_buffer = max_element_buffer; nk_buffer_init_default(&dev->cmds); dev->logical_device = logical_device; dev->physical_device = physical_device; dev->image_views = image_views; dev->image_views_len = image_views_len; dev->color_format = color_format; dev->framebuffers = NULL; dev->framebuffers_len = 0; nk_glfw3_create_sampler(dev); nk_glfw3_create_command_pool(dev, graphics_queue_family_index); nk_glfw3_create_command_buffers(dev); nk_glfw3_create_semaphore(dev); nk_glfw3_create_buffer_and_memory(dev, &dev->vertex_buffer, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, &dev->vertex_memory, max_vertex_buffer); nk_glfw3_create_buffer_and_memory(dev, &dev->index_buffer, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, &dev->index_memory, max_element_buffer); nk_glfw3_create_buffer_and_memory( dev, &dev->uniform_buffer, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, &dev->uniform_memory, sizeof(struct Mat4f)); vkMapMemory(dev->logical_device, dev->vertex_memory, 0, max_vertex_buffer, 0, &dev->mapped_vertex); vkMapMemory(dev->logical_device, dev->index_memory, 0, max_element_buffer, 0, &dev->mapped_index); vkMapMemory(dev->logical_device, dev->uniform_memory, 0, sizeof(struct Mat4f), 0, &dev->mapped_uniform); nk_glfw3_create_render_resources(dev, framebuffer_width, framebuffer_height); } NK_INTERN void nk_glfw3_device_upload_atlas(VkQueue graphics_queue, const void *image, int width, int height) { struct nk_glfw_device *dev = &glfw.vulkan; VkImageCreateInfo image_info; VkResult result; VkMemoryRequirements mem_reqs; VkMemoryAllocateInfo alloc_info; VkBufferCreateInfo buffer_info; uint8_t *data = 0; VkCommandBufferBeginInfo begin_info; VkCommandBuffer command_buffer; VkImageMemoryBarrier image_memory_barrier; VkBufferImageCopy buffer_copy_region; VkImageMemoryBarrier image_shader_memory_barrier; VkFence fence; VkFenceCreateInfo fence_create; VkSubmitInfo submit_info; VkImageViewCreateInfo image_view_info; struct { VkDeviceMemory memory; VkBuffer buffer; } staging_buffer; memset(&image_info, 0, sizeof(VkImageCreateInfo)); image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; image_info.imageType = VK_IMAGE_TYPE_2D; image_info.format = VK_FORMAT_R8G8B8A8_UNORM; image_info.extent.width = (uint32_t)width; image_info.extent.height = (uint32_t)height; image_info.extent.depth = 1; image_info.mipLevels = 1; image_info.arrayLayers = 1; image_info.samples = VK_SAMPLE_COUNT_1_BIT; image_info.tiling = VK_IMAGE_TILING_OPTIMAL; image_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; image_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; result = vkCreateImage(dev->logical_device, &image_info, NULL, &dev->font_image); NK_ASSERT(result == VK_SUCCESS); vkGetImageMemoryRequirements(dev->logical_device, dev->font_image, &mem_reqs); memset(&alloc_info, 0, sizeof(VkMemoryAllocateInfo)); alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; alloc_info.allocationSize = mem_reqs.size; alloc_info.memoryTypeIndex = nk_glfw3_find_memory_index( dev->physical_device, mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); result = vkAllocateMemory(dev->logical_device, &alloc_info, NULL, &dev->font_memory); NK_ASSERT(result == VK_SUCCESS); result = vkBindImageMemory(dev->logical_device, dev->font_image, dev->font_memory, 0); NK_ASSERT(result == VK_SUCCESS); memset(&buffer_info, 0, sizeof(VkBufferCreateInfo)); buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; buffer_info.size = alloc_info.allocationSize; buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; result = vkCreateBuffer(dev->logical_device, &buffer_info, NULL, &staging_buffer.buffer); NK_ASSERT(result == VK_SUCCESS); vkGetBufferMemoryRequirements(dev->logical_device, staging_buffer.buffer, &mem_reqs); alloc_info.allocationSize = mem_reqs.size; alloc_info.memoryTypeIndex = nk_glfw3_find_memory_index( dev->physical_device, mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); result = vkAllocateMemory(dev->logical_device, &alloc_info, NULL, &staging_buffer.memory); NK_ASSERT(result == VK_SUCCESS); result = vkBindBufferMemory(dev->logical_device, staging_buffer.buffer, staging_buffer.memory, 0); NK_ASSERT(result == VK_SUCCESS); result = vkMapMemory(dev->logical_device, staging_buffer.memory, 0, alloc_info.allocationSize, 0, (void **)&data); NK_ASSERT(result == VK_SUCCESS); memcpy(data, image, width * height * 4); vkUnmapMemory(dev->logical_device, staging_buffer.memory); memset(&begin_info, 0, sizeof(VkCommandBufferBeginInfo)); begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; NK_ASSERT(dev->command_buffers_len > 0); /* use the same command buffer as for render as we are regenerating the buffer during render anyway */ command_buffer = dev->command_buffers[0]; result = vkBeginCommandBuffer(command_buffer, &begin_info); NK_ASSERT(result == VK_SUCCESS); memset(&image_memory_barrier, 0, sizeof(VkImageMemoryBarrier)); image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; image_memory_barrier.image = dev->font_image; image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; image_memory_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; image_memory_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; image_memory_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; image_memory_barrier.subresourceRange.levelCount = 1; image_memory_barrier.subresourceRange.layerCount = 1; image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 0, NULL, 1, &image_memory_barrier); memset(&buffer_copy_region, 0, sizeof(VkBufferImageCopy)); buffer_copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; buffer_copy_region.imageSubresource.layerCount = 1; buffer_copy_region.imageExtent.width = (uint32_t)width; buffer_copy_region.imageExtent.height = (uint32_t)height; buffer_copy_region.imageExtent.depth = 1; vkCmdCopyBufferToImage( command_buffer, staging_buffer.buffer, dev->font_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &buffer_copy_region); memset(&image_shader_memory_barrier, 0, sizeof(VkImageMemoryBarrier)); image_shader_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; image_shader_memory_barrier.image = dev->font_image; image_shader_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; image_shader_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; image_shader_memory_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; image_shader_memory_barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; image_shader_memory_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; image_shader_memory_barrier.subresourceRange.levelCount = 1; image_shader_memory_barrier.subresourceRange.layerCount = 1; image_shader_memory_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, image_shader_memory_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT, vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, NULL, 0, NULL, 1, &image_shader_memory_barrier); result = vkEndCommandBuffer(command_buffer); NK_ASSERT(result == VK_SUCCESS); memset(&fence_create, 0, sizeof(VkFenceCreateInfo)); fence_create.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; result = vkCreateFence(dev->logical_device, &fence_create, NULL, &fence); NK_ASSERT(result == VK_SUCCESS); memset(&submit_info, 0, sizeof(VkSubmitInfo)); submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submit_info.commandBufferCount = 1; submit_info.pCommandBuffers = &command_buffer; result = vkQueueSubmit(graphics_queue, 1, &submit_info, fence); NK_ASSERT(result == VK_SUCCESS); result = vkWaitForFences(dev->logical_device, 1, &fence, VK_TRUE, UINT64_MAX); NK_ASSERT(result == VK_SUCCESS); vkDestroyFence(dev->logical_device, fence, NULL); vkFreeMemory(dev->logical_device, staging_buffer.memory, NULL); vkDestroyBuffer(dev->logical_device, staging_buffer.buffer, NULL); memset(&image_view_info, 0, sizeof(VkImageViewCreateInfo)); image_view_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; image_view_info.image = dev->font_image; image_view_info.viewType = VK_IMAGE_VIEW_TYPE_2D; image_view_info.format = image_info.format; image_view_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; image_view_info.subresourceRange.layerCount = 1; image_view_info.subresourceRange.levelCount = 1; result = vkCreateImageView(dev->logical_device, &image_view_info, NULL, &dev->font_image_view); NK_ASSERT(result == VK_SUCCESS); } NK_INTERN void nk_glfw3_destroy_render_resources(struct nk_glfw_device *dev) { uint32_t i; vkDestroyPipeline(dev->logical_device, dev->pipeline, NULL); vkDestroyPipelineLayout(dev->logical_device, dev->pipeline_layout, NULL); vkDestroyDescriptorSetLayout(dev->logical_device, dev->texture_descriptor_set_layout, NULL); vkDestroyDescriptorSetLayout(dev->logical_device, dev->uniform_descriptor_set_layout, NULL); vkDestroyDescriptorPool(dev->logical_device, dev->descriptor_pool, NULL); for (i = 0; i < dev->framebuffers_len; i++) { vkDestroyFramebuffer(dev->logical_device, dev->framebuffers[i], NULL); } free(dev->framebuffers); dev->framebuffers_len = 0; free(dev->texture_descriptor_sets); dev->texture_descriptor_sets_len = 0; vkDestroyRenderPass(dev->logical_device, dev->render_pass, NULL); } NK_API void nk_glfw3_resize(uint32_t framebuffer_width, uint32_t framebuffer_height) { struct nk_glfw_device *dev = &glfw.vulkan; glfwGetWindowSize(glfw.win, &glfw.width, &glfw.height); glfwGetFramebufferSize(glfw.win, &glfw.display_width, &glfw.display_height); glfw.fb_scale.x = (float)glfw.display_width / (float)glfw.width; glfw.fb_scale.y = (float)glfw.display_height / (float)glfw.height; nk_glfw3_destroy_render_resources(dev); nk_glfw3_create_render_resources(dev, framebuffer_width, framebuffer_height); } NK_API void nk_glfw3_device_destroy(void) { struct nk_glfw_device *dev = &glfw.vulkan; vkDeviceWaitIdle(dev->logical_device); nk_glfw3_destroy_render_resources(dev); vkFreeCommandBuffers(dev->logical_device, dev->command_pool, dev->command_buffers_len, dev->command_buffers); vkDestroyCommandPool(dev->logical_device, dev->command_pool, NULL); vkDestroySemaphore(dev->logical_device, dev->render_completed, NULL); vkUnmapMemory(dev->logical_device, dev->vertex_memory); vkUnmapMemory(dev->logical_device, dev->index_memory); vkUnmapMemory(dev->logical_device, dev->uniform_memory); vkFreeMemory(dev->logical_device, dev->vertex_memory, NULL); vkFreeMemory(dev->logical_device, dev->index_memory, NULL); vkFreeMemory(dev->logical_device, dev->uniform_memory, NULL); vkDestroyBuffer(dev->logical_device, dev->vertex_buffer, NULL); vkDestroyBuffer(dev->logical_device, dev->index_buffer, NULL); vkDestroyBuffer(dev->logical_device, dev->uniform_buffer, NULL); vkDestroySampler(dev->logical_device, dev->sampler, NULL); vkFreeMemory(dev->logical_device, dev->font_memory, NULL); vkDestroyImage(dev->logical_device, dev->font_image, NULL); vkDestroyImageView(dev->logical_device, dev->font_image_view, NULL); free(dev->command_buffers); nk_buffer_free(&dev->cmds); } NK_API void nk_glfw3_shutdown(void) { nk_font_atlas_clear(&glfw.atlas); nk_free(&glfw.ctx); nk_glfw3_device_destroy(); memset(&glfw, 0, sizeof(glfw)); } NK_API void nk_glfw3_font_stash_begin(struct nk_font_atlas **atlas) { nk_font_atlas_init_default(&glfw.atlas); nk_font_atlas_begin(&glfw.atlas); *atlas = &glfw.atlas; } NK_API void nk_glfw3_font_stash_end(VkQueue graphics_queue) { struct nk_glfw_device *dev = &glfw.vulkan; const void *image; int w, h; image = nk_font_atlas_bake(&glfw.atlas, &w, &h, NK_FONT_ATLAS_RGBA32); nk_glfw3_device_upload_atlas(graphics_queue, image, w, h); nk_font_atlas_end(&glfw.atlas, nk_handle_ptr(dev->font_image_view), &dev->tex_null); if (glfw.atlas.default_font) { nk_style_set_font(&glfw.ctx, &glfw.atlas.default_font->handle); } } NK_API void nk_glfw3_new_frame(void) { int i; double x, y; struct nk_context *ctx = &glfw.ctx; struct GLFWwindow *win = glfw.win; nk_input_begin(ctx); for (i = 0; i < glfw.text_len; ++i) nk_input_unicode(ctx, glfw.text[i]); #ifdef NK_GLFW_GL4_MOUSE_GRABBING /* optional grabbing behavior */ if (ctx->input.mouse.grab) glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); else if (ctx->input.mouse.ungrab) glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_NORMAL); #endif nk_input_key(ctx, NK_KEY_DEL, glfwGetKey(win, GLFW_KEY_DELETE) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_ENTER, glfwGetKey(win, GLFW_KEY_ENTER) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_TAB, glfwGetKey(win, GLFW_KEY_TAB) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_BACKSPACE, glfwGetKey(win, GLFW_KEY_BACKSPACE) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_UP, glfwGetKey(win, GLFW_KEY_UP) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_DOWN, glfwGetKey(win, GLFW_KEY_DOWN) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_TEXT_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_TEXT_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_SCROLL_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_SCROLL_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_SCROLL_DOWN, glfwGetKey(win, GLFW_KEY_PAGE_DOWN) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_SCROLL_UP, glfwGetKey(win, GLFW_KEY_PAGE_UP) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_SHIFT, glfwGetKey(win, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS || glfwGetKey(win, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS); if (glfwGetKey(win, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS || glfwGetKey(win, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS) { nk_input_key(ctx, NK_KEY_COPY, glfwGetKey(win, GLFW_KEY_C) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_PASTE, glfwGetKey(win, GLFW_KEY_V) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_CUT, glfwGetKey(win, GLFW_KEY_X) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_TEXT_UNDO, glfwGetKey(win, GLFW_KEY_Z) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_TEXT_REDO, glfwGetKey(win, GLFW_KEY_R) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_TEXT_LINE_START, glfwGetKey(win, GLFW_KEY_B) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_TEXT_LINE_END, glfwGetKey(win, GLFW_KEY_E) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_TEXT_SELECT_ALL, glfwGetKey(win, GLFW_KEY_A) == GLFW_PRESS); } else { nk_input_key(ctx, NK_KEY_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS); nk_input_key(ctx, NK_KEY_COPY, 0); nk_input_key(ctx, NK_KEY_PASTE, 0); nk_input_key(ctx, NK_KEY_CUT, 0); } glfwGetCursorPos(win, &x, &y); nk_input_motion(ctx, (int)x, (int)y); #ifdef NK_GLFW_GL4_MOUSE_GRABBING if (ctx->input.mouse.grabbed) { glfwSetCursorPos(glfw.win, ctx->input.mouse.prev.x, ctx->input.mouse.prev.y); ctx->input.mouse.pos.x = ctx->input.mouse.prev.x; ctx->input.mouse.pos.y = ctx->input.mouse.prev.y; } #endif nk_input_button(ctx, NK_BUTTON_LEFT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS); nk_input_button(ctx, NK_BUTTON_MIDDLE, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS); nk_input_button(ctx, NK_BUTTON_RIGHT, (int)x, (int)y, glfwGetMouseButton(win, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS); nk_input_button(ctx, NK_BUTTON_DOUBLE, (int)glfw.double_click_pos.x, (int)glfw.double_click_pos.y, glfw.is_double_click_down); nk_input_scroll(ctx, glfw.scroll); nk_input_end(&glfw.ctx); glfw.text_len = 0; glfw.scroll = nk_vec2(0, 0); } NK_INTERN void update_texture_descriptor_set( struct nk_glfw_device *dev, struct nk_vulkan_texture_descriptor_set *texture_descriptor_set, VkImageView image_view) { VkDescriptorImageInfo descriptor_image_info; VkWriteDescriptorSet descriptor_write; texture_descriptor_set->image_view = image_view; memset(&descriptor_image_info, 0, sizeof(VkDescriptorImageInfo)); descriptor_image_info.sampler = dev->sampler; descriptor_image_info.imageView = texture_descriptor_set->image_view; descriptor_image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet)); descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; descriptor_write.dstSet = texture_descriptor_set->descriptor_set; descriptor_write.dstBinding = 0; descriptor_write.dstArrayElement = 0; descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; descriptor_write.descriptorCount = 1; descriptor_write.pImageInfo = &descriptor_image_info; vkUpdateDescriptorSets(dev->logical_device, 1, &descriptor_write, 0, NULL); } NK_API VkSemaphore nk_glfw3_render(VkQueue graphics_queue, uint32_t buffer_index, VkSemaphore wait_semaphore, enum nk_anti_aliasing AA) { struct nk_glfw_device *dev = &glfw.vulkan; struct nk_buffer vbuf, ebuf; struct Mat4f projection = { {2.0f, 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f}, }; VkCommandBufferBeginInfo begin_info; VkClearValue clear_value = {{{0.0f, 0.0f, 0.0f, 0.0f}}}; VkRenderPassBeginInfo render_pass_begin_nfo; VkCommandBuffer command_buffer; VkResult result; VkViewport viewport; VkDeviceSize doffset = 0; VkImageView current_texture = NULL; uint32_t index_offset = 0; VkRect2D scissor; uint32_t wait_semaphore_count; VkSemaphore *wait_semaphores; VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VkSubmitInfo submit_info; projection.m[0] /= glfw.width; projection.m[5] /= glfw.height; memcpy(dev->mapped_uniform, &projection, sizeof(projection)); memset(&begin_info, 0, sizeof(VkCommandBufferBeginInfo)); begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; memset(&render_pass_begin_nfo, 0, sizeof(VkRenderPassBeginInfo)); render_pass_begin_nfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; render_pass_begin_nfo.renderPass = dev->render_pass; render_pass_begin_nfo.renderArea.extent.width = (uint32_t)glfw.width; render_pass_begin_nfo.renderArea.extent.height = (uint32_t)glfw.height; render_pass_begin_nfo.clearValueCount = 1; render_pass_begin_nfo.pClearValues = &clear_value; render_pass_begin_nfo.framebuffer = dev->framebuffers[buffer_index]; command_buffer = dev->command_buffers[buffer_index]; result = vkBeginCommandBuffer(command_buffer, &begin_info); NK_ASSERT(result == VK_SUCCESS); vkCmdBeginRenderPass(command_buffer, &render_pass_begin_nfo, VK_SUBPASS_CONTENTS_INLINE); memset(&viewport, 0, sizeof(VkViewport)); viewport.width = (float)glfw.width; viewport.height = (float)glfw.height; viewport.maxDepth = 1.0f; vkCmdSetViewport(command_buffer, 0, 1, &viewport); vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, dev->pipeline); vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, dev->pipeline_layout, 0, 1, &dev->uniform_descriptor_set, 0, NULL); { /* convert from command queue into draw list and draw to screen */ const struct nk_draw_command *cmd; /* load draw vertices & elements directly into vertex + element buffer */ { /* fill convert configuration */ struct nk_convert_config config; static const struct nk_draw_vertex_layout_element vertex_layout[] = {{NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, position)}, {NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_glfw_vertex, uv)}, {NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct nk_glfw_vertex, col)}, {NK_VERTEX_LAYOUT_END}}; NK_MEMSET(&config, 0, sizeof(config)); config.vertex_layout = vertex_layout; config.vertex_size = sizeof(struct nk_glfw_vertex); config.vertex_alignment = NK_ALIGNOF(struct nk_glfw_vertex); config.tex_null = dev->tex_null; config.circle_segment_count = 22; config.curve_segment_count = 22; config.arc_segment_count = 22; config.global_alpha = 1.0f; config.shape_AA = AA; config.line_AA = AA; /* setup buffers to load vertices and elements */ nk_buffer_init_fixed(&vbuf, dev->mapped_vertex, (size_t)dev->max_vertex_buffer); nk_buffer_init_fixed(&ebuf, dev->mapped_index, (size_t)dev->max_element_buffer); nk_convert(&glfw.ctx, &dev->cmds, &vbuf, &ebuf, &config); } /* iterate over and execute each draw command */ vkCmdBindVertexBuffers(command_buffer, 0, 1, &dev->vertex_buffer, &doffset); vkCmdBindIndexBuffer(command_buffer, dev->index_buffer, 0, VK_INDEX_TYPE_UINT16); nk_draw_foreach(cmd, &glfw.ctx, &dev->cmds) { if (!cmd->texture.ptr) { continue; } if (cmd->texture.ptr && cmd->texture.ptr != current_texture) { int found = 0; uint32_t i; for (i = 0; i < dev->texture_descriptor_sets_len; i++) { if (dev->texture_descriptor_sets[i].image_view == cmd->texture.ptr) { found = 1; break; } } if (!found) { update_texture_descriptor_set( dev, &dev->texture_descriptor_sets[i], (VkImageView)cmd->texture.ptr); dev->texture_descriptor_sets_len++; } vkCmdBindDescriptorSets( command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, dev->pipeline_layout, 1, 1, &dev->texture_descriptor_sets[i].descriptor_set, 0, NULL); } if (!cmd->elem_count) continue; scissor.offset.x = (int32_t)(NK_MAX(cmd->clip_rect.x, 0.f)); scissor.offset.y = (int32_t)(NK_MAX(cmd->clip_rect.y, 0.f)); scissor.extent.width = (uint32_t)(cmd->clip_rect.w); scissor.extent.height = (uint32_t)(cmd->clip_rect.h); vkCmdSetScissor(command_buffer, 0, 1, &scissor); vkCmdDrawIndexed(command_buffer, cmd->elem_count, 1, index_offset, 0, 0); index_offset += cmd->elem_count; } nk_clear(&glfw.ctx); } vkCmdEndRenderPass(command_buffer); result = vkEndCommandBuffer(command_buffer); NK_ASSERT(result == VK_SUCCESS); if (wait_semaphore) { wait_semaphore_count = 1; wait_semaphores = &wait_semaphore; } else { wait_semaphore_count = 0; wait_semaphores = NULL; } memset(&submit_info, 0, sizeof(VkSubmitInfo)); submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submit_info.commandBufferCount = 1; submit_info.pCommandBuffers = &command_buffer; submit_info.pWaitDstStageMask = &wait_stage; submit_info.waitSemaphoreCount = wait_semaphore_count; submit_info.pWaitSemaphores = wait_semaphores; submit_info.signalSemaphoreCount = 1; submit_info.pSignalSemaphores = &dev->render_completed; result = vkQueueSubmit(graphics_queue, 1, &submit_info, NULL); NK_ASSERT(result == VK_SUCCESS); return dev->render_completed; } NK_API void nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint) { (void)win; if (glfw.text_len < NK_GLFW_TEXT_MAX) glfw.text[glfw.text_len++] = codepoint; } NK_API void nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff) { (void)win; (void)xoff; glfw.scroll.x += (float)xoff; glfw.scroll.y += (float)yoff; } NK_API void nk_glfw3_mouse_button_callback(GLFWwindow *window, int button, int action, int mods) { double x, y; NK_UNUSED(mods); if (button != GLFW_MOUSE_BUTTON_LEFT) return; glfwGetCursorPos(window, &x, &y); if (action == GLFW_PRESS) { double dt = glfwGetTime() - glfw.last_button_click; if (dt > NK_GLFW_DOUBLE_CLICK_LO && dt < NK_GLFW_DOUBLE_CLICK_HI) { glfw.is_double_click_down = nk_true; glfw.double_click_pos = nk_vec2((float)x, (float)y); } glfw.last_button_click = glfwGetTime(); } else glfw.is_double_click_down = nk_false; } NK_INTERN void nk_glfw3_clipboard_paste(nk_handle usr, struct nk_text_edit *edit) { const char *text = glfwGetClipboardString(glfw.win); if (text) nk_textedit_paste(edit, text, nk_strlen(text)); (void)usr; } NK_INTERN void nk_glfw3_clipboard_copy(nk_handle usr, const char *text, int len) { char *str = 0; (void)usr; if (!len) return; str = (char *)malloc((size_t)len + 1); if (!str) return; memcpy(str, text, (size_t)len); str[len] = '\0'; glfwSetClipboardString(glfw.win, str); free(str); } NK_API struct nk_context * nk_glfw3_init(GLFWwindow *win, VkDevice logical_device, VkPhysicalDevice physical_device, uint32_t graphics_queue_family_index, VkImageView *image_views, uint32_t image_views_len, VkFormat color_format, enum nk_glfw_init_state init_state, VkDeviceSize max_vertex_buffer, VkDeviceSize max_element_buffer) { memset(&glfw, 0, sizeof(struct nk_glfw)); glfw.win = win; if (init_state == NK_GLFW3_INSTALL_CALLBACKS) { glfwSetScrollCallback(win, nk_gflw3_scroll_callback); glfwSetCharCallback(win, nk_glfw3_char_callback); glfwSetMouseButtonCallback(win, nk_glfw3_mouse_button_callback); } nk_init_default(&glfw.ctx, 0); glfw.ctx.clip.copy = nk_glfw3_clipboard_copy; glfw.ctx.clip.paste = nk_glfw3_clipboard_paste; glfw.ctx.clip.userdata = nk_handle_ptr(0); glfw.last_button_click = 0; glfwGetWindowSize(win, &glfw.width, &glfw.height); glfwGetFramebufferSize(win, &glfw.display_width, &glfw.display_height); nk_glfw3_device_create(logical_device, physical_device, graphics_queue_family_index, image_views, image_views_len, color_format, max_vertex_buffer, max_element_buffer, (uint32_t)glfw.display_width, (uint32_t)glfw.display_height); glfw.is_double_click_down = nk_false; glfw.double_click_pos = nk_vec2(0, 0); return &glfw.ctx; } #endif