1655 lines
74 KiB
C
1655 lines
74 KiB
C
/*
|
|
* 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 <assert.h>
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
#define GLFW_INCLUDE_VULKAN
|
|
#include <GLFW/glfw3.h>
|
|
|
|
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 <stdlib.h>
|
|
|
|
#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;
|
|
float delta_time_seconds_last;
|
|
} 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;
|
|
|
|
/* update the timer */
|
|
float delta_time_now = (float)glfwGetTime();
|
|
glfw.ctx.delta_time_seconds = delta_time_now - glfw.delta_time_seconds_last;
|
|
glfw.delta_time_seconds_last = delta_time_now;
|
|
|
|
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
|